OAuth๋ž€

OAuth๋Š” Open Authorization์˜ ์ค„์ž„๋ง๋กœ, ์•ก์„ธ์Šค ์œ„์ž„์„ ์œ„ํ•œ ๊ฐœ๋ฐฉํ˜• ํ‘œ์ค€ ์ธ๊ฐ€ ํ”„๋กœํ† ์ฝœ์ด๋‹ค. ํ•ด๋‹น ์ธ์ฆ ๋ฐ”์—์‹์€ ์„œ๋น„์Šค ์ œ๊ณต ์—…์ฒด(๋„ค์ด๋ฒ„, ๊นƒํ—ˆ๋ธŒ ๋“ฑ)์˜ ์ •๋ณด๋ฅผ ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด ์ •๋ณด์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ, ํ˜„์žฌ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋กœ๊ทธ์ธ ๋ฐฉ์‹์ด๋‹ค.

์œ„์˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์š”์ฆ˜ ํ”ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ์ธ ๋ฐฉ์‹์ด๋‹ค. ์–ด๋– ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ด์šฉํ•˜๊ณ ์ž ํ•  ๋•Œ, ๊ตฌ๊ธ€, ์นด์นด์˜ค์™€ ๊ฐ™์€ ์ œ 3์˜ ์„œ๋น„์Šค์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ณ„์ •์˜ ์ •๋ณด๋ฅผ ์‚ฌ์šฉ์ž๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๋ฒ”์œ„์— ํ•œํ•ด์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

Authorization๊ณผ Authentication

Authentication(์ธ์ฆ)๊ณผ Authorization(์ธ๊ฐ€)์˜ ๊ฐœ๋…์— ๋Œ€ํ•ด์„œ ์ž˜ ๋ชจ๋ฅด๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค. ํฌ๊ฒŒ ๋ณด๋ฉด ๋‘˜ ๋‹ค ๊ฐ™์€ ๋‹จ์–ด ๊ฐ™์ง€๋งŒ, ๋‘ ๊ฐœ๋…์„ ์„ธ๋ถ€์ ์œผ๋กœ ์•Œ๊ฒŒ ๋˜๋ฉด ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ ๋ถ€ํ„ฐ ์งš๊ณ  ๋„˜์–ด๊ฐ€์•ผ ํ•  ํ•„์š”์„ฑ์ด ์žˆ๋‹ค.

Authentication(์ธ์ฆ) : ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์ด ์ฃผ์žฅํ•˜๋Š” ๊ทธ ์‚ฌ๋žŒ์ธ์ง€ ํ™•์ธ์„ ํ•˜๋Š” ๊ฒƒ Authorization(์ธ๊ฐ€) : ํ•ด๋‹น ์‚ฌ์šฉ์ž๊ฐ€ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒƒ

์˜ˆ๋ฅผ ๋“ค์–ด ํŽธ์˜์ ์— ์ˆ ์„ ์‚ฌ๋Ÿฌ ๊ฐ„๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ํŽธ์˜์ ์—๋Š” ์ˆ ์„ ์‚ฌ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ฑ์ธ์ด ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ํŽธ์˜์  ์•Œ๋ฐ”๋Š” ์†๋‹˜์—๊ฒŒ โ€˜๋ฏผ์ฆ ๊ฒ€์‚ฌโ€™๋ฅผ ์š”๊ตฌํ•œ๋‹ค. ๋ฏผ์ฆ์„ ํ†ตํ•ด ํ•ด๋‹น ์†๋‹˜์ด ์ž์‹ ์ด ์ฃผ์žฅํ•˜๋Š” โ€˜์„ฑ์ธโ€™์ด ๋งž๋Š”์ง€ ๋ฏผ์ฆ์„ ํ†ตํ•ด โ€˜์ธ์ฆโ€™ํ•˜๊ณ  ์•Œ๋ฐ”์ƒ์€ ์ด๋ฅผ ํ™•์ธํ•œ๋‹ค. ์ด ๊ณผ์ •์ด ์ธ์ฆ์ด๋‹ค. ๋ฏผ์ฆ์„ ํ†ตํ•ด ์„ฑ์ธ์ž„์ด ํ™•์ธ ๋˜๋ฉด, ํ•ด๋‹น ์†๋‹˜์—๊ฒŒ๋Š” ์ˆ ์„ ์‚ด ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ ์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๊ฒƒ์ด ์ธ๊ฐ€์ด๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์‹œ๊ธˆ OAuth์˜ ํ’€ ๋„ค์ž„์„ ์ง์—ญํ•ด๋ณด์•˜์„ ๋•Œ, ๊ฐœ๋ฐฉ๋œ ์ธ๊ฐ€๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠน์ • ์ œ 3์˜ ์„œ๋น„์Šค๋“ค์€ ์ธ์ฆ์ด ์™„๋ฃŒ๋˜๋ฉด, ํ•ด๋‹น ์„œ๋น„์Šค์—๊ฒŒ ์œ ์ €์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” OAuth์˜ ์˜๋ฏธ๋ฅผ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

OAuth์˜ ํ•ต์‹ฌ ์ฃผ์ฒด

OAuth์—์„œ์˜ ์ฃผ์ฒด๋Š” ํฌ๊ฒŒ ์„ธ๊ฐ€์ง€, ์ž‘๊ฒŒ ๋‚˜๋ˆ„๋ฉด ๋„ค ๊ฐ€์ง€ ์ •๋„๋กœ ๋‚˜๋‰œ๋‹ค.

  • Resource Owner(or User)
    • ๋ฆฌ์†Œ์Šค๋ฅผ ์†Œ์œ ํ•œ ์‚ฌ์šฉ์ž๋กœ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฆฌ์†Œ์Šค ๊ณต์œ  ์š”์ฒญ์„ ํ—ˆ๊ฐ€
    • ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋ ค๋Š” ์‚ฌ์šฉ์ž
  • Client(or Consumer)
    • ์‚ฌ์šฉ์ž์˜ ํ—ˆ๊ฐ€๋ฅผ ๋ฐ›์•„ ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์š”์ฒญํ•˜๋Š” ์‘์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜
    • ์ œ๊ณตํ•˜๋ ค๋Š” ์„œ๋น„์Šค
  • Server(or Provider)
    • ์‚ฌ์šฉ์ž์˜ ํ—ˆ๊ฐ€๋ฅผ ๊ฒ€์ฆํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ์— ์‘์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ณด์œ ํ•œ ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ์„œ๋ฒ„
    • ์ผ๋ฐ˜์ ์œผ๋กœ ํ—ˆ๊ฐ€๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ฒ€์ฆ ์„œ๋ฒ„(Authorization Server)์™€ ์‹ค์ œ ์‚ฌ์šฉ์ž ๋ฆฌ์†Œ์Šค๋ฅผ ๋ณด์œ ํ•œ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„(Resource Server, or API Server)๋กœ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Œ
    • ์ œ3์˜ ์„œ๋น„์Šค(๋„ค์ด๋ฒ„, ์นด์นด์˜ค, ๊ตฌ๊ธ€ ๋“ฑ)

์ž‘๋™ ๋ฐฉ์‹

 +--------+                               +---------------+
 |        |--(A)- Authorization Request ->|   Resource    |
 |        |                               |     Owner     |
 |        |<-(B)-- Authorization Grant ---|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(C)-- Authorization Grant -->| Authorization |
 | Client |                               |     Server    |
 |        |<-(D)----- Access Token -------|               |
 |        |                               +---------------+
 |        |
 |        |                               +---------------+
 |        |--(E)----- Access Token ------>|    Resource   |
 |        |                               |     Server    |
 |        |<-(F)--- Protected Resource ---|               |
 +--------+                               +---------------+

ํ”„๋กœํ† ์ฝœ ์ž์ฒด์˜ ํ”Œ๋กœ์šฐ๋Š” ์ด์™€ ๊ฐ™์ด ๊ตฌ์„ฑ๋œ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์œ ์ €๊ฐ€ ์ธ์ฆ์„ ์™„๋ฃŒํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ์ธก์— ์ธ์ฆ์ด ์ œ๋Œ€๋กœ ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฐ๋‹ค. ์ธ์ฆ์ด ์ œ๋Œ€๋กœ ์™„๋ฃŒ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ์ธ์ฆ ์„œ๋ฒ„์— ์ธ์ฆ์ด ํ™•์ธ๋˜์—ˆ์Œ์„ ์•Œ๋ฆฌ๊ณ , ์—‘์„ธ์Šค ํ† ํฐ์„ ์–ป๋Š”๋‹ค. ์—‘์„ธ์Šค ํ† ํฐ์„ ์–ป๊ฒŒ ๋˜๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฆฌ์†Œ์Šค, ์ฆ‰ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„œ๋ฒ„์— ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ณด๋‚ด ์œ ์ €๊ฐ€ ๋ช…์‹œํ•œ ์ œํ•œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  1. ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž(์ดํ•˜ ์œ ์ €)๊ฐ€ ํด๋ผ์ด์–ธํŠธ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ณ ์ž ์ด์šฉ ์š”์ฒญ์„ ๋ณด๋ƒ„
  2. ํด๋ผ์ด์–ธํŠธ๋Š” ๊ฒ€์ฆ(Authorization) ์„œ๋ฒ„์— ์•ก์„ธ์Šค ํ† ํฐ์„ ์š”์ฒญ
  3. ๊ฒ€์ฆ ์„œ๋ฒ„๋Š” ์œ ์ €์—๊ฒŒ ์ธ๊ฐ€(Authentication) ๋™์˜๋ฅผ ์š”์ฒญ
    • ์—ฌ๊ธฐ์—์„œ ์œ ์ €๋Š” ์–ด๋А ์ •๋„์˜ ๋ฒ”์œ„๋ฅผ ํ•ด๋‹น ์„œ๋น„์Šค(client)์—๊ฒŒ ์ œ๊ณตํ•  ์ง€ ์ง์ ‘ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค.
  4. ์œ ์ €๋Š” ์ธ๊ฐ€(Authentication) ๋™์˜๋ฅผ ์‘๋‹ต
  5. ๊ฒ€์ฆ ์„œ๋ฒ„๋Š” ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ์ƒ์„ฑํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†ก
  6. ํด๋ผ์ด์–ธํŠธ๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ์ €์žฅ
  7. ํด๋ผ์ด์–ธํŠธ๋Š” ์•ก์„ธ์Šค ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์š”์ฒญ
  8. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ์•ก์„ธ์Šค ํ† ํฐ์˜ ์œ ํšจ์„ฑ์„ ํŒŒ์•…ํ•˜๊ณ  ๋‚˜์„œ, ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต
  9. ํด๋ผ์ด์–ธํŠธ๋Š” ์œ ์ €์— ์„œ๋น„์Šค ์ด์šฉ์„ ์‘๋‹ต

๊ณผ ๊ฐ™์ด ์ด๋ฃจ์–ด์ง€๋Š” ๊ฒƒ์ด๋‹ค.

์—‘์„ธ์Šค ํ† ํฐ์„ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹

์—‘์„ธ์Šคํ† ํฐ์˜ ๊ฒฝ์šฐ ๋„ค ๊ฐ€์ง€ ๋ฐฉ์‹์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค. ํ˜„์žฌ Implicit ๋ฐฉ์‹๊ณผ Password Grant(Resource Owner Credentials) ๋ฐฉ์‹์˜ ๊ฒฝ์šฐ Deprecated ์ƒํƒœ์ด๋ฉฐ, ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ์ด๋Š” ๋ฐฉ์‹์€ Authorization Code ๋ฐฉ์‹์ด๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ๋„˜๊ฒจ์ฃผ์ง€ ์•Š์œผ๋ฉด์„œ๋„ ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐ”๋กœ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋‚ด๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ Code๋ฅผ ๋ฐ›์•„ ๋‹ค์‹œ ์ธ์ฆ ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ ํ›„์— ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐ›์•„์˜ค๋Š” ๋ฐฉ์‹์ด ํ•œ ๋‹จ๊ณ„๋ฅผ ๋” ๊ฑฐ์น˜๋ฉด์„œ ๋ณด์•ˆ์ƒ์œผ๋กœ ๋”์šฑ ์ด์ ์„ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์—‘์„ธ์Šค ํ† ํฐ์— ๋‹ด๊ฒจ์žˆ๋Š” ์ •๋ณด

์ธ์ฆ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์•„์˜ค๋Š” ์—‘์„ธ์Šค ํ† ํฐ์€ ์œ„์™€ ๊ฐ™์€ ์ •๋ณด๋“ค์„ ๋‹ด๊ณ  ์žˆ๋‹ค.

Authorization Code ๋ฐฉ์‹ ๋” ์•Œ์•„๋ณด๊ธฐ

๊ทธ๋ ‡๋‹ค๋ฉด ํ˜„์žฌ ๋งŽ์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” Authorization Code๋ฐฉ์‹์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.

     +----------+
     | Resource |
     |   Owner  |
     |          |
     +----------+
          ^
          |
         (B)
     +----|-----+          Client Identifier      +---------------+
     |         -+----(A)-- & Redirection URI ---->|               |
     |  User-   |                                 | Authorization |
     |  Agent  -+----(B)-- User authenticates --->|     Server    |
     |          |                                 |               |
     |         -+----(C)-- Authorization Code ---<|               |
     +-|----|---+                                 +---------------+
       |    |                                         ^      v
      (A)  (C)                                        |      |
       |    |                                         |      |
       ^    v                                         |      |
     +---------+                                      |      |
     |         |>---(D)-- Authorization Code ---------'      |
     |  Client |          & Redirection URI                  |
     |         |                                             |
     |         |<---(E)----- Access Token -------------------'
     +---------+       (w/ Optional Refresh Token)
 
   Note: The lines illustrating steps (A), (B), and (C) are broken into
   two parts as they pass through the user-agent.
 
                     Figure 3: Authorization Code Flow

Authorization Code์˜ ๋ฐฉ์‹์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ ์„œ๋ฒ„์— ์ž์‹ ์˜ ์„œ๋น„์Šค๋ฅผ ๋“ฑ๋กํ•œ ๋’ค, ํ•ด๋‹น ์„œ๋น„์Šค์˜ ์ฝ”๋“œ์™€ redirect URI๋ฅผ ๋ณด๋‚ด๋ฉด์„œ ์‹œ์ž‘๋œ๋‹ค. ์—ฌ๊ธฐ์„œ redirect URI๋Š” ์ธ์ฆ ์„œ๋ฒ„์—์„œ ์ž์ฒด์ ์ธ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋ฅผ ๋„์šฐ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ์ด ๋œ ํ›„ ์ธ์ฆ์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ๋‹ค์‹œ redirect URI๋กœ ๋ณด๋‚ด๊ฒŒ ๋œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ธ์ฆ์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ redirect URI์—์„œ๋Š” code๋ฅผ URI์— ๋ถ™์—ฌ์„œ ๋ณด๋‚ด์ฃผ๋Š”๋ฐ, ์ด code๋ฅผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ ์„œ๋ฒ„์— ๋‹ค์‹œ๊ธˆ ๋ณด๋‚ด๋ฉด์„œ ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๊ณ„์† ์—‘์„ธ์Šค ํ† ํฐ์„ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋“ค๊ณ  ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ํ†ตํ•ด ์—‘์„ธ์Šค ํ† ํฐ์—๋Š” ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๋‘๊ณ  ๋งŒ๋ฃŒ๋˜๋ฉด ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ํ†ตํ•ด ์—‘์„ธ์Šคํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ๋ฐฉ์‹์ด ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ธฐ ๋–„๋ฌธ์— ์ธ์ฆ ์„œ๋ฒ„์—์„œ๋„ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ ๋˜ํ•œ ํ•จ๊ป˜ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

+--------+                                           +---------------+
  |        |--(A)------- Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<-(B)----------- Access Token -------------|               |
  |        |               & Refresh Token             |               |
  |        |                                           |               |
  |        |                            +----------+   |               |
  |        |--(C)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(D)- Protected Resource --| Resource |   | Authorization |
  | Client |                            |  Server  |   |     Server    |
  |        |--(E)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(F)- Invalid Token Error -|          |   |               |
  |        |                            +----------+   |               |
  |        |                                           |               |
  |        |--(G)----------- Refresh Token ----------->|               |
  |        |                                           |               |
  |        |<-(H)----------- Access Token -------------|               |
  +--------+           & Optional Refresh Token        +---------------+
 
               Figure 2: Refreshing an Expired Access Token

์—‘์„ธ์Šค ํ† ํฐ์ด ๋ฐœ๊ธ‰๋˜๋ฉด, ํด๋ผ์ด์–ธํŠธ๋Š” ์ด ์—‘์„ธ์Šคํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์—‘์„ธ์Šค ํ† ํฐ๊ณผ ํ•จ๊ป˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” API๋ฅผ ๋ณด๋‚ธ๋‹ค. ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„๋Š” ์ด์— ์‘๋‹ตํ•˜์—ฌ ์ฒ˜์Œ ์œ ์ €๊ฐ€ ์ธ์ฆํ•  ๋•Œ ์„œ๋น„์Šค์— ์ฒดํฌํ•œ ์ •๋ณด ์ œ๊ณต์˜ ๋ฒ”์œ„๊นŒ์ง€์˜ ์ •๋ณด๋ฅผ ๋‹ด์•„ ํด๋ผ์ด์–ธํŠธ์— ๋ณด๋‚ด์ค€๋‹ค.

์ด๋ ‡๊ฒŒ ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ณด๋‚ด๋‹ค๊ฐ€ ์ค‘๊ฐ„์— ์—‘์„ธ์Šค ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜๋ฉด, ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋ณด๋‚ด ์ƒˆ๋กœ์šด ์—‘์„ธ์Šค ํ† ํฐ์„ ๋ฐœ๊ธ‰๋ฐ›์•„ ๊ธฐ์กด์˜ ์—‘์„ธ์Šค ํ† ํฐ์„ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰๋œ๋‹ค.

PKCE

PKCE(Proof Key for Code Exchange)๋Š” Authorization Code Flow๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฝ”๋“œ ๊ตํ™˜ ๊ณผ์ •์˜ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด OAuth 2.1์—์„œ ํ•„์ˆ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๊ธฐ์กด Authorization Code Flow๋ณด๋‹ค ๋” ๋†’์€ ๋ณด์•ˆ์„ฑ์„ ์š”๊ตฌํ•œ๋‹ค.

PKCE๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•„๋“œ๋“ค์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ฐ€์ง„๋‹ค.

  • code_verifier: ์•ฑ์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜๋Š” ์ž„์˜์˜ ๋žœ๋ค ๋ฌธ์ž์—ด์ด๋‹ค.
  • code_challenge:ย code_verifier์™€ ์ง์„ ์ด๋ฃจ๋Š” ๋ฌธ์ž์—ด
    • code_verifier๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์ง€๋งŒ S256 ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ์•”ํ˜ธํ™”ํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋œ๋‹ค. OAuth ์„œ๋ฒ„๋Š” ์ด ๋ฌธ์ž์—ด์„ ๋ณตํ˜ธํ™”ํ•˜์—ฌ,ย code_verifier์™€ ๊ฐ™์€์ง€ ํ™•์ธํ•จ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.
  • code_challenge_method:ย code_verifier์˜ ๋ณ€ํ™˜์— ์–ด๋–ค ํ•จ์ˆ˜๊ฐ€ ์‚ฌ์šฉ๋˜๋Š”์ง€(S256 ๋˜๋Š” plain) ์ง€์ •ํ•˜๋Š” ํ•„๋“œ์ด๋‹ค. ๊ธฐ๋ณธ๊ฐ’์€ plain์œผ๋กœ, ์ด ๊ฒฝ์šฐย code_verifier์™€ย code_challenge๋Š” ๊ฐ™์€ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋œ๋‹ค.

์ด ํ•„๋“œ๋“ค์„ ํ†ตํ•ด OAuth ์„œ๋ฒ„๋Š” ์ธ์ฆ ์š”์ฒญ๊ณผ ํ† ํฐ ์š”์ฒญ์ด ๋™์ผํ•œ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์˜จ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

PCKE์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์œ ์ €๊ฐ€ ๋กœ๊ทธ์ธ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ์•ฑ ์ž์ฒด์—์„œ ์ธ์ฆ ์ฝ”๋“œ ์š”์ฒญ์„ ๋ณด๋‚ด๊ธฐ ์ „์— code_verifier์™€ code_challenge๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ณผ์ •์ด ๊ธฐ์กด์˜ code ๋ฐฉ์‹์—์„œ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.

์ธ์ฆ ์ฝ”๋“œ ์š”์ฒญ์„ ํ•  ๋•Œ ์ด code_challenge์™€ ํ•จ๊ป˜ ์š”์ฒญ์ด ๋‚ ์•„๊ฐ„๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด์˜ ๊ณต๊ฐœ ์ œํ•œ ๋ฒ”์œ„๋ฅผ ์„ ํƒํ•˜๊ณ  ๋กœ๊ทธ์ธ์„ ํ•˜๊ฒŒ ๋˜๋ฉด code๋ฅผ ๋‹ด์•„ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ๋œ๋‹ค.

์ดํ›„์— code๋ฅผ ๊ฐ€์ง€๊ณ  ๋‹ค์‹œ๊ธˆ ์•ฑ์ด ํ† ํฐ์„ ์–ป๊ธฐ ์œ„ํ•ด ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ณผ์ •์—์„œ ์•„๊นŒ ์ธ์ฆ ์„œ๋ฒ„๋กœ ๋ณด๋ƒˆ๋˜ code_challenge์™€ ๋น„๊ตํ•  ๋Œ€์ƒ ๋ฌธ์ž์—ด์ธ code_verifier๋ฅผ ํ•จ๊ป˜ ๋ณด๋‚ธ๋‹ค. ๋น„๊ต ๋ฌธ์ž์—ด์ด ์„œ๋กœ ๊ฒ€์ฆํ•ด์„œ ๋งž์•„ ๋–จ์–ด์ง€๊ฒŒ ๋˜๋ฉด ์—‘์„ธ์Šค ํ† ํฐ๊ณผ ์„ ํƒ์ ์œผ๋กœ ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๋‹ค์‹œ๊ธˆ ๋ณด๋‚ด์ค€๋‹ค. ์ดํ›„์—๋Š” ์œ ์ €๊ฐ€ ๋ฐ›์€ ์—‘์„ธ์Šค ํ† ํฐ์„ ๊ฐ€์ง€๊ณ  ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

OAuth์˜ ์žฅ์ 

OAuth๊ฐ€ ๋‹ค์–‘ํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ์˜ ์ˆ˜๋‹จ์œผ๋กœ ์‚ฌ์šฉ๋œ ์ด์œ ๋Š” ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ๊ณ„์ • ์ •๋ณด๋ฅผ ์•Œ์ง€ ์•Š์•„๋„ ํšŒ์›์˜ ์ •๋ณด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์ด ๋ณด์•ˆ์— ๋„์›€์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

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