• Home
  • About
    • on Weekend photo

      on Weekend

      ๐™Ž๐™ฉ๐™ช๐™™๐™ฎ๐™ž๐™ฃ๐™œ

    • Learn More
    • Instagram
    • Github
  • Archive
    • All Posts
    • All Tags
    • All Categories
  • Categories
    • Problem Solving
    • TIL
    • Study
    • Etc
    • ํ•„์‚ฌ
  • Projects

OAuth 1.0๊ณผ 2.0 : OAuth Dance/Request Token/Access Token/Refresh Token/RFC3986/H-MAC

14 Apr 2021

๋ชฉ์ฐจ

  • ๋ชฉ์ฐจ
  • OAuth
  • OAuth 1.0
    • OAuth Dance
  • Request Token
    • Consumer -> Service Provider
    • oauth_signature
    • Service Provider -> Consumer
  • Direct & User Authorization
    • Consumer Directs User to Service Provider
    • Service Provider Directs User to Consumer
    • Access Token
    • Consumer can access Protected Resources
  • OAuth 2.0
    • ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ OAuth 2.0 ์‚ฌ์šฉํ•ด๋ณด๊ธฐ
    • ๋™์ž‘ ํ๋ฆ„
  • ์ถ”๊ฐ€ ๊ณต๋ถ€ ์ž๋ฃŒ
    • URL ์ธ์ฝ”๋”ฉ(rfc3986)
    • H-MAC
  • References

OAuth

OAuth๋Š” ์ธ์ฆ์„ ์œ„ํ•œ ์˜คํ”ˆ ์Šคํƒ ๋”๋“œ ํ”„๋กœํ† ์ฝœ์„ ์˜๋ฏธํ•œ๋‹ค.

  • OpenID : Authentication์ธ์ฆ์ด ์ฃผ์š” ๋ชฉ์ 
  • OAuth : Authorizationํ—ˆ๊ฐ€๊ฐ€ ์ฃผ์š” ๋ชฉ์ 

ํŠน์ • API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ž„. ๊ฐ€๋ น ํŽ˜์ด์Šค๋ถ์—์„œ ๊น€๋š๋”ฑ์ด๋ผ๋Š” ์‚ฌ๋žŒ์˜ ๋‹ด๋ฒผ๋ฝ์— ๊ธ€์„ ์“ธ ๊ถŒํ•œ์ด ํ•ด๋‹น ์‚ฌ์šฉ์ž์—๊ฒŒ ์กด์žฌํ•˜๋Š”๊ฐ€์˜ ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

OAuth 1.0

OAuth Dance

OAuth๋ฅผ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋Š” ๊ณผ์ •์„ OAuth Dance๋ผ๊ณ  ํ•œ๋‹ค. ์ง„์งœ ์ถค์„ ์ถ”๋“ฏ์ด ๋‘ ๋ช…์ด ์ •๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๊ณผ์ •์„ ์žฌ๋ฏธ์žˆ๊ฒŒ ๋ช…๋ช…ํ•œ ๊ฒƒ์ด๋‹ค.

img

  1. Consumer๊ฐ€ Request Token์„ Requestํ•ฉ๋‹ˆ๋‹ค.
  2. Service Provider๊ฐ€ Request Token์„ ๋ถ€์—ฌ(Grant) ํ•ด์ฃผ๊ณ , token ๊ด€๋ จ๋œ ์ •๋ณด๋“ค์„ Response๋กœ ๋„˜๊ฒจ์ค๋‹ˆ๋‹ค.
  3. Consumer๊ฐ€ Access Token์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  4. Service Provider๊ฐ€ Access Token์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค.
  5. Consumer๋Š” ์ด์ œ Protected Resources์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

์œ„์˜ ๊ณผ์ •์—์„œ ์ฃผ๊ณ ๋ฐ›๋Š” Token๋“ค์˜ ๋งค๊ฐœ๋ณ€์ˆ˜์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Request Token

image-20210414214636047

Consumer -> Service Provider

Consumer๊ฐ€ Service Provider์—๊ฒŒ Request Token์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ (์œ„์˜ ํ‘œ ์ฐธ์กฐ)

  • oauth_consumer_key : Consumer๋ฅผ ๊ตฌ๋ณ„ํ•˜๋Š” ๊ณ ์œ ํ•œ ๊ฐ’.
  • oauth_signature_method : oauth_signature๋ฅผ ์•”ํ˜ธํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•. HMAC-SHA1, HMAC-MD5 ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • oauth_signature : ์„œ๋ช…๊ฐ’. OAuth ์ธ์ฆ ์ •๋ณด๋ฅผ ์•”ํ˜ธํ™”ํ•˜๊ณ  ์ธ์ฝ”๋”ฉํ•˜์—ฌ ๋งŒ๋“ ๋‹ค. ์ธ์ฆ ์ •๋ณด๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ์ค‘์—์„œ oauth_signature๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜์™€ HTTP ์š”์ฒญ ๋ฐฉ์‹์„ ๋ฌธ์ž์—ด๋กœ ์กฐํ•ฉํ•œ ๊ฐ’์ด๋‹ค.
  • oauth_timestamp : ์š”์ฒญ์„ ์ƒ์„ฑํ•œ ์‹œ์ ์˜ ํƒ€์ž„์Šคํƒฌํ”„. 1970-01-01 00:00:00 ์ดํ›„์˜ ์‹œ๊ฐ„์„ ์ดˆ๋กœ ํ™˜์‚ฐํ•œ ์ดˆ ๋‹จ์œ„์˜ ๋ˆ„์  ์‹œ๊ฐ„
  • oauth_nonce : Consumer์—์„œ ์ž„์˜๋กœ ์ƒ์„ฑํ•œ ๋ฌธ์ž์—ด. timestamp์˜ ๊ฐ’์ด ๊ฐ™์€ ์š”์ฒญ์—์„œ๋Š” ์œ ์ผํ•œ ๊ฐ’์ด์–ด์•ผ ํ•œ๋‹ค. (์•…์˜์ ์ธ ๋ชฉ์ ์œผ๋กœ ๊ณ„์† ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฑธ ๋ง‰๊ธฐ ์œ„ํ•ด์„œ๋ผ๋Š”๋ฐ, ์ด๊ฒŒ Consumer์˜ ๊ณ ์œ ๊ฐ’์œผ๋กœ์„œ Service Provider๊ฐ€ ๋ถ„๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๊ฑฐ๋‚˜ ํ•˜๋Š”๋“ฏ? ํ˜น์€ ํ•œ Consumer๋Š” 1์ดˆ์— 1๊ฐœ์˜ ์š”์ฒญ๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ฑฐ๋‚˜?)
  • oauth_version (optional) : 1.0a๋Š” 1.0์ด๋ผ๊ณ  ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
  • oauth_callback : ์ธ์ฆ์„ ์™„๋ฃŒํ•œ ํ›„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  ์›น ์ฃผ์†Œ. (callback์„ ๋ฐ›์•„์„œ returnํ•ด์ฃผ๋ฉด redirect๋˜๋‹ˆ๊นŒ.) ๋งŒ์•ฝ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•  ์ฃผ์†Œ๊ฐ€ ์—†๋‹ค๋ฉด oob(Out Of Band)๋ฅผ ๋ณด๋‚ธ๋‹ค๊ณ  ํ•œ๋‹ค.

oauth_signature

๋‹น์—ฐํžˆ Consumer์™€ Service Provider๋Š” ๊ฐ™์€ ์•”ํ˜ธํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. oauth_signature๋ฅผ ๋งŒ๋“œ๋Š” ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. (oauth_signatrue๋ฅผ ์ œ์™ธํ•˜๊ณ , oauth_๋กœ ์‹œ์ž‘ํ•˜๋Š”) ์š”์ฒญ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ชจ๋‘ ๋ชจ์€๋‹ค. POST body์—์„œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด ์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ๋ชจ์€๋‹ค.

  2. ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ •๊ทœํ™”ํ•œ๋‹ค.

    • ๋งค๊ฐœ๋ณ€์ˆ˜ ์‚ฌ์ „์ˆœ ์ •๋ ฌํ•˜๊ณ ,
    • ๊ฐ๊ฐ์˜ key์™€ value์— URL ์ธ์ฝ”๋”ฉ(rfc3986)์„ ์ ์šฉํ•œ๋‹ค. URL ์ธ์ฝ”๋”ฉ์„ ์‹ค์‹œํ•œ ๊ฒฐ๊ณผ๋ฅผ = ํ˜•ํƒœ๋กœ ๋‚˜์—ดํ•˜๊ณ  ์Œ ์‚ฌ์ด์—๋Š” &์„ ๋„ฃ๋Š”๋‹ค.
    • ์ด๋ ‡๊ฒŒ ๋‚˜์˜จ ๊ฒฐ๊ณผ ์ „์ฒด์— ํ•œ ๋ฒˆ ๋” URL์ธ์ฝ”๋”ฉ์„ ์ ์šฉํ•œ๋‹ค.
  3. Signature Base String์„ ๋งŒ๋“ ๋‹ค.

    • HTTP Method + Consumer๊ฐ€ ํ˜ธ์ถœํ•œ URL ์ฃผ์†Œ + ์ •๊ทœํ™”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ &์„ ์‚ฌ์šฉํ•ด ๊ฒฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  4. ํ‚ค ์ƒ์„ฑ

    • ์œ„์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ ์ƒ์„ฑ๋œ ๋ฌธ์ž์—ด์„ ์•”ํ˜ธํ™”ํ•ฉ๋‹ˆ๋‹ค. ์•”ํ˜ธํ™”ํ•  ๋•Œ Consumer Secret Key(Consumer๊ฐ€ Service Provider์— ์‚ฌ์šฉ ๋“ฑ๋ก์„ ํ•  ๋•Œ ๋ฐœ๊ธ‰๋ฐ›๋Š” ๊ฐ’์œผ๋กœ, Consumer๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์œ ํ•œ ๊ฐ’)์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค.
    • HMAC-SHA1 ๋“ฑ์˜ ์•”ํ˜ธํ™” ๋ฐฉ๋ฒ•์„ ์ด์šฉํ•˜์—ฌ ์ตœ์ข… oauth_signature๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

Service Provider -> Consumer

Service Provider๋Š” Consumer๊ฐ€ ๋ณด๋‚ธ Request Token์„ Grant(์ธ์ฆ)ํ•ด์ฃผ๊ณ , ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‘๋‹ต์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

  • oauth_token : Consumer๊ฐ€ Request Token์œผ๋กœ ์‚ฌ์šฉํ•  ํ† ํฐ
  • oauth_token_secret : Access Token์œผ๋กœ ๊ตํ™˜ํ•˜๊ธฐ ์œ„ํ•ด Service Provider๊ฐ€ ์ „๋‹ฌํ•ด์ค€ ๊ฐ’ (Consumer๋Š” ์ด ๊ฐ’์„ HTTP ์„ธ์…˜์ด๋‚˜ ์ฟ ํ‚ค ๋˜๋Š” DBMS ๋“ฑ์— ์ €์žฅํ•ด๋‘์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)
  • oauth_callback_confirmed

(์˜๋ฌธ : ๊ทผ๋ฐ ๊ทธ๋Ÿผ Response๋กœ ๋„˜์–ด์˜จ oauth_token_secret์„.. ํ›”์น˜๋ฉด ์•ˆ๋˜๋Š”๊ฑด๊ฐ€..?)

Direct & User Authorization

image-20210414214731149

Consumer Directs User to Service Provider

  • Request : oauth_token(optional)

oauth_token์„ ์ด์šฉํ•ด Service Provider๊ฐ€ ์ •ํ•ด๋†“์€ ์‚ฌ์šฉ์ž ์ธ์ฆ ํŽ˜์ด์ง€๋ฅผ User์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Request Token์„ ์š”์ฒญํ•˜๊ณ  ๋ฐ˜ํ™˜๋ฐ›์•˜๋˜ oauth_token์„ ๋งค๊ฐœ ๋ณ€์ˆ˜๋กœ Service Provider๊ฐ€ ์ •ํ•ด๋‘” ์‚ฌ์šฉ์ž ์ธ์ฆ ํŽ˜์ด์ง€๋ฅผ ์œ ์ €์—๊ฒŒ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๊ฐ€๋ น OAuth๋ฅผ ์ œ๊ณตํ•˜๋Š” Service Provider๊ฐ€ ์‚ฌ์šฉ์ž ์ธ์ฆ ํŽ˜์ด์ง€๋ฅผ https://auth.com ์ด๋ผ๊ณ  ์ •ํ•ด๋‘์—ˆ๋‹ค๋ฉด(์‹ค์ œ๋กœ๋Š” Service Provider๋ฅผ Host๋กœ, ์ฟผ๋ฆฌ๋ฅผ ๋‚ ๋ฆฌ๋˜๊ฐ€ location์„ ์ถ”๊ฐ€ํ•ด์„œ ๋˜๋˜๊ฐ€ ํ•˜๋Š” ๋“ฏ), oauth_token์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ https://auth.com?oauth_token=goaigjieaWR2z ์š”๋Ÿฐ ์‹์œผ๋กœ redirect ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Service Provider Directs User to Consumer

  • Request : oauth_token, oauth_verifier

์œ„์—์„œ ์ œ๊ฐ€ ์˜๋ฌธ์„ ๊ฐ€์กŒ๋˜.. oauth_token_secret๊ณผ oauth_token์„ ํƒˆ์ทจํ•˜๋ฉด ์•ˆ๋˜๋ƒ? ํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต์ด ๋˜๊ฒ ๋„ค์š”. ํƒˆ์ทจํ•˜๋”๋ผ๋„ OAuth๋ฅผ ํ˜ธ์ถœ? ํ–ˆ๋˜ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•„๋‹ˆ๊ธฐ๋•Œ๋ฌธ์—, redirect ๊ณผ์ •์„ ๊ฑฐ์น˜๋ฉฐ, OAUTH AUTHENTICATION FLOW์—์„œ ๋“ฑ์žฅํ–ˆ๋˜ Obtain User Authorizaion์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒ ๋„ค์š”.

๋‹ค์‹œ ์ฐจ๊ทผ์ฐจ๊ทผ ์œ„์—์„œ๋ถ€ํ„ฐ ๋Œ์ด์ผœ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ํ˜„์žฌ๊นŒ์ง€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณ์™”์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Service Provider ์ž…์žฅ์—์„œ ๊ฐœ๋ฐœํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์œผ๋ฏ€๋กœ, Service Provider๋ฅผ ์šฐ๋ฆฌ๋ผ๊ณ  ์นญํ•˜๋ฉฐ ์ดํ•ดํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ Request Token์„ ์š”์ฒญ. ์ด๋•Œ ๋ณธ์ธ์˜ ์ •๋ณด(oauth_consumer_key, oauth_timestamp, oauth_callback, โ€ฆ)์™€ ์šฐ๋ฆฌ์™€ ์•ฝ์†ํ•œ key ์ •๋ณด๋“ค(oauth_signature_method, oauth_signature)์„ ์šฐ๋ฆฌํ•œํ…Œ ๋ฉ”์„ธ์ง€์— ๋„ฃ์–ด ๋ณด๋‚ด์ค๋‹ˆ๋‹ค.
  2. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฑธ ์ฝ๊ณ , ์ ํ•ฉํ•œ ์ •๋ณด๊ฐ€ ๋ณด๋‚ด์ ธ์™”๋‹ค๋ฉด Grant๋ฅผ ํ•ด์ค๋‹ˆ๋‹ค. ์ฆ‰, ํ•ด์‹ฑ๋œ ๊ฐ’์ด ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ–ˆ๋˜ ๊ทธ ๊ฐ’๊ณผ ๊ฐ™์€์ง€, ์ค‘๊ฐ„์— ์œ„๋ณ€์กฐ๋˜์ง„ ์•Š์•˜๋Š”์ง€๋ฅผ ํŒŒ์•…ํ•ด์„œ, validํ•˜๋‹ค๋ฉด Grant๋ฅผ ์ค๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ฃผ๋ƒ๋ฉด ์•ž์œผ๋กœ Consumer๊ฐ€ ํ† ํฐ์œผ๋กœ ์‚ฌ์šฉํ•  ๋†ˆ๋“ค(oauth_token, oauth_token_secret)์„ ๋‹ด์•„์„œ Responseํ•ด์ค๋‹ˆ๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ์š”์ฒญ์„ ๋ณด๋ƒˆ๋˜ ์œ ์ €๋ฅผ ์ง์ ‘ ์šฐ๋ฆฌ์—๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ฃผ๋ƒ๋ฉด, ์šฐ๋ฆฌ๊ฐ€ ์ œ์‹œํ•œ url์— oauth_token์„ query๋กœ ๋‹ด๊ณ  ์œ ์ €๊ฐ€ ์ด๋†ˆ์ด๋‹ค! ํ•˜๋Š” ๊ฑธ ์šฐ๋ฆฌํ•œํ…Œ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์šฐ๋ฆฌ๋Š” ์•„ํ•˜, ์ด๋†ˆ์ด ๊ทธ๋†ˆ์ด๊ตฌ๋งŒ, ๊ทธ๋ž˜ ๋„ˆ์˜ ํ† ํฐ ์ด๊ฑฐ๊ตฌ๋‚˜~ ํ•˜๊ณ  ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์œ ์ €๋ฅผ ๋Œ๋ ค๋ณด๋ƒ…๋‹ˆ๋‹ค. ์œ ์ €์˜ ์†์— oauth_token๊ณผ oauth_verifier๋ฅผ ์ฅ์–ด์ค˜์„œ์š”. ์–ด๋””๋กœ ๋Œ๋ ค๋ณด๋‚ด์ฃผ๋ƒ๋ฉด, ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์ง€์ •ํ–ˆ๋˜ oauth_callback์œผ๋กœ ๋Œ๋ ค๋ณด๋‚ด์ค๋‹ˆ๋‹ค. ์ด๋•Œ ์ฅ์–ด์ค€ oauth_token๊ณผ oauth_verifier๋Š” Access Token์„ ์š”์ฒญํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

Access Token

Access Token๋งŒ ์žˆ๋‹ค๋ฉด ์ด์ œ ์œ ์ €๋Š” ํ•ด๋‹น ํ† ํฐ์„ ์ถœ์ž…์ฆ์‚ผ์•„ ์ œํ•œ์ด ํ—ˆ์šฉ๋œ ๊ณณ๋“ค์„ ๋‹ค๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ด์ œ ์ถœ์ž…์ฆ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์šฐ๋ฆฌ์—๊ฒŒ Access Token์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฉ”์‹œ์ง€์— ๋‹ด๊ฒจ ์˜ฌ ๋งค๊ฐœ๋ณ€์ˆ˜๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Request

  • oauth_consumer_key
  • oauth_token
  • oauth_signature_method
  • oauth_signature
  • oauth_timestamp
  • oauth_nonce
  • oauth_version (optional)
  • oauth_verifier

์šฐ๋ฆฌ๋Š” ์œ„์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ๋ฐ›๊ณ , ๋‹ค ์ ํ•ฉํ•˜๋‹ค๋ฉด Access Token์„ ๋ฐœ๊ธ‰ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋•Œ Response๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Response

  • oauth_token
  • oauth_token_secret : Consumer Secret Key์— oauth_token_secret์„ &ํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•ด oauth_token_secret์„ ์ƒ์„ฑํ•ด ์ „๋‹ฌํ•ด์ค๋‹ˆ๋‹ค. (์•”ํ˜ธํ™” ํ‚ค๋ฅผ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ณด์•ˆ์„ ๋” ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•จ)

Consumer can access Protected Resources

์ด์ œ ํด๋ผ์ด์–ธํŠธ๋Š” ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์˜คํ”ˆ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ํ˜ธ์ถœํ•  ๋•Œ์— ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ๋Š” ๋ฐœ๊ธ‰๋ฐ›์•˜๋˜ ์ถœ์ž…์ฆ์ธ Access Token์„ ๋“ค๊ณ  ๋‹ค๋…€์•ผ๊ฒ ์ฃ ?

Request

  • oauth_consumer_key
  • oauth_token
  • oauth_signature_method
  • oauth_signature
  • oauth_timestamp
  • oauth_nonce
  • oauth_version (optional)

OAuth 2.0

๋ผˆ ๋น ์ ธ๋ผ OAuth 1.0์„ ๊ณต๋ถ€ํ–ˆ๋”๋‹ˆ OAuth 2.0์ด ๋“ฑ์žฅํ–ˆ๋„ค์š”. OAuth 1.0์ด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹Œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์‚ฌ์šฉํ•˜๊ธฐ ๊ณค๋ž€ํ•˜๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๊ณ , ์ ˆ์ฐจ๊ฐ€ ๋ณต์žกํ•˜์—ฌ ์„œ๋ฒ„ ์ธก์—๋„ ์—ฐ์‚ฐ ๋ถ€๋‹ด์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ์ ์„ ๊ฐœ์„ ์‹œํ‚จ OAuth๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

OAuth 2.0์€ HMAC ์•”ํ˜ธํ™” ๋Œ€์‹  HTTPS๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , URL ์ธ์ฝ”๋”ฉ ๋“ฑ์ด ์—†๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, Access Token์˜ Life-time์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋„ค์š”. ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์ด 2012๋…„๋„ ๊ฒŒ์‹œ๊ธ€์ด๋‹ˆ, ์ง€๊ธˆ ์ฐพ์•„๋ณด๋ฉด ์ด๋ฏธ OAuth 2.0์ด ๋‚˜์™”์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” JWT๋ฅผ ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์‹ถ์–ด OAuth 1.0๋ถ€ํ„ฐ ์ญ‰ ํ›‘์–ด๋ณด์•˜๋Š”๋ฐ, ๋งŒ์•ฝ ๋น ๋ฅธ ํ™œ์šฉ์ด ํ•„์š”ํ•˜์‹  ๋ถ„๋“ค์ด๋ผ๋ฉด OAuth 2.0์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ๋™์ž‘ ํ๋ฆ„์„ ๊ณต๋ถ€ํ•˜์‹œ๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.

OAuth 2.0์˜ ๊ฒฝ์šฐ์—๋Š” Request Token๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , Refresh Token ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํ† ํฐ + Access Token์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. JWT๋ฅผ ๊ณต๋ถ€ํ•  ๋•Œ ํฌ๋ฏธํ•˜๊ฒŒ ๋ณด์•˜๋˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค. (Refresh Token์€ Optional์ด๋ผ๋Š” ๋ง๋„ ์žˆ๋Š”๋ฐ, ์Œ.. ์•„์ง์€ ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๋„ค์š”.)

OAuth 2.0์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ์ƒํ™œ์ฝ”๋”ฉ OAuth 2.0์„ ์ˆ˜๊ฐ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค. (1.75๋ฐฐ์†์œผ๋กœ ๋“ค์œผ๋ฉด 1์‹œ๊ฐ„ ์ •๋„๋ฉด ์ˆ˜๊ฐ•์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.)

๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ OAuth 2.0 ์‚ฌ์šฉํ•ด๋ณด๊ธฐ

  1. Google Calendar API - API ๊ด€๋ฆฌ์ž
  2. APIs Explorer์—์„œ ๋ช…์„ธ๋ฅผ ์ฝ๊ณ  ์‚ฌ์šฉํ•œ๋‹ค.
    • scope : google calendar์˜ list๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ๊ตฌ๊ธ€์˜ - ์บ˜๋ฆฐ๋”์˜ - List๋ผ๋Š” Resource์— ๋Œ€ํ•œ ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›์•„์•ผ ํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ํ—ˆ๊ฐ€ ๋ฒ”์œ„๋ฅผ scope์ด๋ผ ํ•œ๋‹ค.
    • ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” API Key๋ฅผ request์— ํ•จ๊ป˜ ๋ณด๋‚ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๋™์ž‘ ํ๋ฆ„

  1. ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ๋ฆฌ์˜ ์„œ๋ฒ„(Client)์— ์ ‘์†ํ•˜๋ฉด
  2. ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์— ์ธ์ฆ์„ ์š”์ฒญํ•˜๋Š” ํ™”๋ฉด์ด ๋œฌ๋‹ค.
  3. ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ธ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด Resource Server๋กœ ์ ‘์†ํ•˜๊ฒŒ ๋œ๋‹ค.
    • access_type=offline์œผ๋กœ ์„ค์ •์„ ํ•˜๋ฉด refresh token๋„ ๊ฐ™์ด ๋ณด๋‚ด์ค€๋‹ค. ์ด๋ฅผ ์‚ฌ์šฉํ•ด access token์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๋•Œ, ๋‹ค์‹œ access token์„ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • redirect_url : authorize code๊ฐ’์„ ํด๋ผ์ด์–ธํŠธ์˜ ์–ด๋А ์ฃผ์†Œ๋กœ ์ด์ค„๊นŒ
  4. ์‚ฌ์šฉ์ž์˜ ํ™”๋ฉด์— ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” scope list๋ฅผ ๋ณด์—ฌ์ฃผ๊ณ  Resource Server๊ฐ€ Client์—๊ฒŒ ๋™์˜๋ฅผ ๊ตฌํ•œ๋‹ค.
  5. ๋™์˜๋ฅผ ํ•˜๋ฉด, Resource Server๊ฐ€ Client์—๊ฒŒ Authroize Code๋ฅผ ๋ณด๋‚ธ๋‹ค. (๊ฐ€๋ น ๊ตฌ๊ธ€์˜ list๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๊ฒ ๋‹ค ํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ)
  6. ํด๋ผ์ด์–ธํŠธ๊ฐ€ code, client id, client secret์„ Resource Server๋กœ ๋ณด๋‚ธ๋‹ค.
  7. Resource Server๋Š” Access Token์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ณด๋‚ธ๋‹ค.
  8. ํด๋ผ์ด์–ธํŠธ๋Š” Access Token์„ ์‚ฌ์šฉํ•ด API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
    • refresh token์€ ์ตœ์ดˆ ๋ฐœํ–‰ ์‹œ์—๋งŒ ๋ฐœ๊ธ‰๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น refresh token์€ ์ž˜ ๋ณด๊ด€ํ–ˆ๋‹ค๊ฐ€ ์ถ”ํ›„์— ๊ฐฑ์‹ ํ•  ๋•Œ์— ์‚ฌ์šฉํ•ด์•ผํ•จ.

์ถ”๊ฐ€ ๊ณต๋ถ€ ์ž๋ฃŒ

URL ์ธ์ฝ”๋”ฉ(rfc3986)

rfc3986์ด๋ž€ URI(Uniform Resource Identifier)์˜ ํ‘œ์ค€ ๋ฌธ๋ฒ•์„ ์˜๋ฏธํ•œ๋‹ค.

image-20210414190840283

์ธํ„ฐ๋„ท ์ƒ์˜ ์ •๋ณด ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ ์œ ํ•˜๊ฒŒ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ๋ฒ•์˜ ์„ธ๋ถ€ ๋‚ด์šฉ์€ ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • scheme : ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ (ex. http:, https:, ftp:, โ€ฆ)
  • authority : ํ˜ธ์ŠคํŠธ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ์˜ ๋„๋ฉ”์ธ + ํฌํŠธ๋ฒˆํ˜ธ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค.
  • path : ๋ฆฌ์†Œ์Šค์˜ ์œ„์น˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • query : ? ๋’ค๋กœ query๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • fragment : ์„œ๋ฒ„๋กœ๋Š” ๋„˜์–ด๊ฐ€์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. http ๋‚ด๋ถ€ ๊ฒ€์ƒ‰ ๋“ฑ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (๋ชฉ์ฐจ๋ฅผ ๋ˆ„๋ฅด๋ฉด ๊ฒŒ์‹œ๊ธ€ ๋‚ด๋ถ€์˜ ์–ด๋–ค ๊ณณ์œผ๋กœ ์ด๋™ํ•˜๋Š” ๋“ฑ)

URI์˜ ์ฐฝ์‹œ์ž๊ฐ€ ๋งŒ๋“  ์ •๊ทœ์‹์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ž˜์˜ ์ •๊ทœ์‹์„ ์‚ฌ์šฉํ•ด ์ƒ๋Œ€ URL์„ ์ ˆ๋Œ€ URL๋กœ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

image-20210414191514190

URL ์ธ์ฝ”๋”ฉ์ด๋ž€, ๋ฌธ์ž๋‚˜ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ์›น ์„œ๋ฒ„์™€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณดํŽธ์ ์œผ๋กœ ํ—ˆ์šฉ๋˜๋Š” ํ˜•์‹์œผ๋กœ ๋ณ€ํ™”์‹œํ‚ค๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ASCII ๋ฌธ์ž ์ง‘ํ•ฉ๋งŒ์„ ์ „์†ก ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ์•ˆ์ „ํ•˜์ง€ ์•Š์€ ์™ธ๋ถ€ ๋ฌธ์ž๋Š” %+16์ง„์ˆ˜ ํ˜•ํƒœ๋กœ ๋ณ€ํ™”์‹œํ‚ต๋‹ˆ๋‹ค.

H-MAC

H-MAC(Hash-based Message Authentication Code)์ด๋ž€ ๋ฉ”์„ธ์ง€ ์œ„๋ณ€์กฐ๋ฅผ ๋ง‰๋Š” ์•”ํ˜ธํ™”๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

image-20210414192649412

๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•ด Hash๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์•”ํ˜ธํ™” ๊ธฐ๋ฒ•์ด๋ผ๊ณ  ๋ณด๋ฉด ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์ž‘์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‚ดํŽด๋ณด๋ฉด,

  1. ์ˆ˜์‹ ์ž๋Š” Shared Key(์ˆ˜์‹ ์ž์™€ ์†ก์‹ ์ž๊ฐ€ ๋ณ„๋„ ์ฑ„๋„๋กœ ๊ณต์œ ํ•˜๋Š” ํ‚ค)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ User ID๋ฅผ ํ•ด์‹œํ•œ๋‹ค.
  2. ์›๋ณธ User ID์™€ ๊ทธ ํ•ด์‹œ ๊ฒฐ๊ณผ(HMAC)์„ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๊ฐ’์œผ๋กœ ์†ก์‹ ์ž์—๊ฒŒ ์ „๋‹ฌํ•œ๋‹ค.
  3. ์ˆ˜์‹ ์ž๋Š” ์ „๋‹ฌ๋ฐ›์€ User ID๋ฅผ Shared Key๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ผํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ•ด์‹œํ•˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ(Receiverโ€™s HMAC)์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  4. Receiverโ€™s HMAC๊ณผ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง์œผ๋กœ ๋ฐ›์€ HMAC์ด ๊ฐ™๋‹ค๋ฉด, User ID๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ๋’ค์— ๋ถ™์–ด์žˆ๋Š” SHA1์€ ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ์š”? ํ•ด์‹œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ SHA1์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. SHA๋ž€ Secure Hash Algorithm์˜ ์ค„์ž„๋ง์ธ๋ฐ์š”. ์ž„์˜ ๊ธธ์ด์˜ ์ž…๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ 160 bits์˜ ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊พธ๋Š” ํ•ด์‹ฑ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ž…๋ ฅํ•œ ๊ธ€์ž์ˆ˜์™€ ์ƒ๊ด€ ์—†์ด ์ผ์ •ํ•œ ๊ธธ์ด์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค!

ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€์€ 2013๋…„๋„์˜ ๊ฒŒ์‹œ๊ธ€์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ณต๋ถ€ํ•œ ํฌ์ŠคํŒ…์ธ ๊นŒ๋‹ญ์— SHA1์ด ์ฃผ์š” ์˜ˆ์‹œ๊ฐ€ ๋˜์—ˆ๋Š”๋ฐ, SHA1์˜ ๊ฒฝ์šฐ์—๋Š” ํ˜„์žฌ๋Š” ํ•ด๋…์˜ ๊ฐ€๋Šฅ์„ฑ๊ณผ ํ•ด์‹œ ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ์š” ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ง€์›์„ ์ค‘๋‹จํ•œ ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

SHA๋Š” ์—ฌ๋Ÿฌ ์‹œ๋ฆฌ์ฆˆ๊ฐ€ ์žˆ๋Š”๋ฐ์š”. ์ข…์ข… ๋ณด์ด๋Š” SHA-256์˜ ๊ฒฝ์šฐ์—๋Š” SHA์˜ 2๋ฒˆ์งธ ์‹œ๋ฆฌ์ฆˆ, ๊ทธ ์ค‘ ๋‹ค์ด์ œ์ŠคํŠธ์˜ ๊ธธ์ด๊ฐ€ 256byte์ธ ๊ฒƒ์„ SHA-256์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. (๋น„ํŠธ์ฝ”์ธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด SHA-256์ž…๋‹ˆ๋‹ค.) ๋‹ค์ด์ œ์ŠคํŠธ(Digest)๋ž€ ํ•ด์‹ฑ ํ•จ์ˆ˜๊ฐ€ ์ ์šฉ๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

(Input data๋Š” message๋ผ ๋ถˆ๋ฆฌ๊ณ , output์€ message digest ํ˜น์€ the digest๋ผ๊ณ  ๋ถˆ๋ฆฐ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.)

References

OAuth์™€ ํ•จ๊ป˜ ์ถค์„

URL ์ธ์ฝ”๋”ฉ

H-MAC SHA-1

Cryptographic hash function

OAuth 2.0

RFC 6749, OAuth 2.0 ๊ตฌํ˜„ํ•˜๊ธฐ

์ƒํ™œ์ฝ”๋”ฉ - OAuth 2.0 ์‚ฌ์šฉํ•˜๊ธฐ



OAuthsecurity Share Tweet +1