์ธ์ฆ ์ด ์ •๋ฆฌ :: 1. ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” Auth Flow Best Case (feat. OpenIDC)

์ธ์ฆ Best Case

๊ธฐ๋ณธ flow (OpenIDC)

Best Case๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ธ์ฆ flow(OpenIDC)๋ฅผ ๋จผ์ € ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, Auth Service๊ฐ€ ํƒ€ ์„œ๋น„์Šค๊ฐ€ ์•„๋‹Œ ์ž์‚ฌ์˜ ์„œ๋น„์Šค์ผ ๋•Œ๋Š” OAuth ๊ธฐ๋ฐ˜์˜ flow๊ฐ€ ํ•„์š”์—†์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œํ€€์Šค ๋‹ค์ด์–ด๊ทธ๋žจ์ด ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค. (ํƒ€ ์„œ๋น„์Šค์ผ ๊ฒฝ์šฐ OAuth ๋ณด๊ธฐ)

auth flow

  1. Client๊ฐ€ id(username)์™€ password๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธํ•ฉ๋‹ˆ๋‹ค. ๋กœ๊ทธ์ธ ์š”์ฒญ์€ BFF → Server → Auth Service๋กœ ์ „ํ•ด์ง‘๋‹ˆ๋‹ค.
  2. ์ „๋‹ฌ๋œ id์™€ password๋กœ Auth Service์—์„œ ์ธ์ฆํ•ฉ๋‹ˆ๋‹ค.
  3. ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด access token, refresh token, id token ๋ฅผ Server๋กœ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  4. Server๋Š” id token ์„ decodeํ•˜์—ฌ userInfo๋ฅผ ์–ป๊ณ , id token ์€ ๋”ฐ๋กœ ์ €์žฅํ•ด๋‘ก๋‹ˆ๋‹ค.
  5. Server๊ฐ€ BFF Server์— userInfo์™€ token๋“ค(access token, refresh token)์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  6. id token ๊นŒ์ง€ ๋‚ด๋ ค์ฃผ์–ด BFF Server๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด์„œ decodeํ•˜์—ฌ userInfo๋ฅผ ๋‚ด๋ ค์ค„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  7. BFF Server๊ฐ€ refresh token ๋ฅผ ์ž์ฒด ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
    1. refresh token ์ž์ฒด๋ฅผ ๋‚ด๋ ค์ฃผ๊ณ  Client์—์„œ http-only ์ฟ ํ‚ค๋กœ ์ €์žฅํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
    2. ๋Œ€๋ถ€๋ถ„ User๊ฐ€ ํ•œ์ •๋˜์–ด์žˆ๋Š” ๋ฐฑ์˜คํ”ผ์Šค์—์„œ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. refresh token์ด ๊ณต๊ฐœ ๋˜์–ด ์žˆ๋”๋ผ๋„ ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Server์˜ api endpoint๋ฅผ ๋ชจ๋ฅด๋ฉด ๊ณต๊ฒฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    3. refresh token์ด ํƒˆ์ทจ๋ ๊นŒ ๊ฑฑ์ •๋œ๋‹ค๋ฉด BFF์—์„œ (key : index(or hash value), value : refresh token)์ธ ์ธ๋ฑ์Šค DB์™€ ํ†ต์‹ ํ•˜๋ฉด์„œ key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ Client์— ๋‚ด๋ ค์ค˜ ์ฟ ํ‚ค๋กœ ์ €์žฅํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์–ด์ฐจํ”ผ Client์—์„œ๋Š” ์ธ๋ฑ์Šค DB์˜ ๊ฒฝ๋กœ์™€ ์ ‘๊ทผ ๋ฐฉ๋ฒ•์„ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— refresh token์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.
    4. (์œ„์˜ flow์—์„œ๋Š” ์ด ๋ฐฉ๋ฒ•์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.)
    5. ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ธ๋ฑ์Šค DB์™€์˜ ํ†ต์‹ ์„ Server์—์„œ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  8. refresh token์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์ด๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  9. response์˜ header์— ์˜ํ•ด access token ์ด Client์˜ ์ฟ ํ‚ค์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. ๋”ํ•ด์„œ userInfo์™€ refresh key๊ฐ€ ํ•จ๊ป˜ ๋‚ด๋ ค์˜ต๋‹ˆ๋‹ค.
    1. access token ์„ ์ฟ ํ‚ค๋กœ ์ €์žฅํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ์ €์žฅํ•œ ํ›„, Request Header์— ์ง์ ‘ Authorization ์†์„ฑ์œผ๋กœ ๋‹ด์•„ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
  10. Client์—์„œ access token ์ด ๋‹ด๊ธด cookie๋ฅผ ํฌํ•จํ•ด์„œ api ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์š”์ฒญ์€ BFFServer๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.
  11. Server์—์„œ Auth Service์— ํ•ด๋‹น access token์ด ์œ ํšจํ•œ ์ง€ ๊ฒ€์ฆ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  12. Auth Service์—์„œ ๊ฒ€์ฆ ํ›„ (access token์ด ์ด์ƒํ•œ ๊ฐ’ ์ด๊ฑฐ๋‚˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€๋‚œ ๋“ฑ์˜ ์ด์œ ๋กœ) ์‹คํŒจ๊ฐ€ ๋‚˜์™”๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ด…์‹œ๋‹ค. Auth Service → Server → BFF Server → Client ๋กœ ๊ฒ€์ฆ ์‹คํŒจ๋ฅผ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค.
  13. Client๋Š” ์ธ์ฆ ์‹คํŒจ๋ฅผ ํ™•์ธํ•œ ํ›„ BFF์— ๋ณด์œ ํ•˜๊ณ  ์žˆ๋˜ refresh key ์™€ ํ•จ๊ป˜ access token ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํ•ด๋‹น ์š”์ฒญ์€ BFF์—์„œ ์ธ๋ฑ์Šค DB์— ์˜ํ•ด refresh token ์œผ๋กœ ๋ณ€๊ฒฝ๋˜์–ด Server๋ฅผ ๊ฑฐ์ณ Auth Service๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    1. ๋งŒ์ผ Client์˜ http-only ์ฟ ํ‚ค๋กœ ๋„˜์–ด์˜จ๋‹ค๋ฉด ๋‹ค๋ฅธ ๊ณผ์ •์—†์ด ๋ฐ”๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
    2. BFF Server์—์„œ ์ธ๋ฑ์Šค DB์™€ ํ†ต์‹ ํ•œ๋‹ค๋ฉด ์ „๋‹ฌ ๋ฐ›์€ refresh key๋ฅผ ์ด์šฉํ•ด refresh token์„ ์ฐพ์•„ Server์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    3. Server์—์„œ ์ธ๋ฑ์Šค DB์™€ ํ†ต์‹ ํ•œ๋‹ค๋ฉด refresh key ๋ฅผ Server์— ์ „๋‹ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  14. Auth Service์—์„œ refresh token์˜ ๊ฒ€์ฆ์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.
  15. ๊ฒ€์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด Auth Service์—์„œ Server๋กœ access token ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  16. Server์—์„œ BFF Server๋กœ access token ๊ณผ userInfo ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  17. BFF Server๋Š” Client์— userInfo์™€ access token์„ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค.
  18. Client๋Š” api ์š”์ฒญ์„ access token ์ด ์žˆ๋Š” cookie์™€ ํ•จ๊ป˜ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์š”์ฒญ์€ BFF Server๋ฅผ ๊ฑฐ์ณ Server๋กœ ๊ฐ‘๋‹ˆ๋‹ค.
  19. Server์—์„œ๋Š” Auth Service์— access token ์— ๋Œ€ํ•œ ๊ฒ€์ฆ ์š”์ฒญ์„ ํ•ฉ๋‹ˆ๋‹ค.
  20. Auth Service์—์„œ ์ธ์ฆ ์„ฑ๊ณต์ด ๋‚ด๋ ค์˜ค๋ฉด response๊ฐ€ Client์—๊นŒ์ง€ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค.

 

์ธ์ฆ ๋ฐ ์ธ๊ฐ€

OpenIDC ์—์„œ๋Š” access token์œผ๋กœ ์ธ์ฆ(ํŠน์ • User์ž„์„ ์ฆ๋ช…)ํ•˜๊ณ , id token์œผ๋กœ ์ธ๊ฐ€(์–ด๋–ค ๊ถŒํ•œ์ด ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธ)ํ•ฉ๋‹ˆ๋‹ค.

 

ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ

์œ„์ฒ˜๋Ÿผ ํ† ํฐ์„ ์ด์šฉํ•˜์—ฌ ์ธ์ฆํ•˜๋Š” flow๋ฅผ ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ์ธ์ฆ์ด๋ผ ์ผ์ปซ์Šต๋‹ˆ๋‹ค.

ํ† ํฐ์€ ๋‹ค์Œ์˜ 3๊ฐ€์ง€ ์ข…๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • access token : ์‚ฌ์šฉ์ž ์ธ์ฆ ๋ชฉ์ 
  • refresh token : access token ์žฌ๋ฐœ๊ธ‰ ๋ชฉ์ 
  • id token : ์ •๋ณด ์ „๋‹ฌ์˜ ๋ชฉ์ 

access token์€ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋ฉฐ ์ฟ ํ‚ค์— ์ฃผ๋กœ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํƒˆ์ทจ ์‹œ ๋น ๋ฅด๊ฒŒ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ํšจ์‹œ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  refresh token์„ ์ด์šฉํ•˜์—ฌ access token ์„ ๋ฌดํ•œ์ • ์žฌ๋ฐœ๊ธ‰ ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ refresh token ์ด ํƒˆ์ทจ๋˜๋ฉด ์œ„ํ—˜ํ•ฉ๋‹ˆ๋‹ค.

 

refresh token์˜ ์ €์žฅ ๋ฐฉ๋ฒ•

๋”ฐ๋ผ์„œ, 6๋ฒˆ ๊ณผ์ •์—์„œ ๋ณด์•˜๋“ฏ์ด refresh token์ด ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

  1. refresh token ์ž์ฒด๋ฅผ Client์—์„œ http-only ์ฟ ํ‚ค๋กœ ์ €์žฅ
  2. BFF์—์„œ (key : index(or hash value), value : refresh token)์ธ ์ธ๋ฑ์Šค DB์™€ ํ†ต์‹ ํ•˜๋ฉด์„œ key์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ’์„ Client์— ๋‚ด๋ ค์ค˜ ์ฟ ํ‚ค๋กœ ์ €์žฅ
  3. 2์™€ ๊ฐ™์€ ๋ฐฉ์‹์ด์ง€๋งŒ ์ธ๋ฑ์Šค DB์™€์˜ ํ†ต์‹ ์„ Server์—์„œ

 

JWT

ํ† ํฐ์€ ์ฃผ๋กœ JWT ๋ฐฉ์‹์œผ๋กœ ๋ณ€ํ™˜๋˜์–ด Client์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

 

JWT๋Š” JSON ๊ฐ์ฒด๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. JWT๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ถ”๊ธฐ ์œ„ํ•ด์„œ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๊ณ  ์ž…์ฆ๋œ ์‚ฌ์šฉ์ž์— ์˜ํ•ด ๋ณด๋‚ด์กŒ์Œ ์„ ์ฆ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. JWT๋ฅผ ์ด์šฉํ•˜๋ฉด User๋ฅผ ์„œ๋ฒ„ session์— ์ €์žฅํ•˜์ง€ ์•Š๊ณ ๋„(User๋งˆ๋‹ค Session์„ ์œ ์ง€ํ•˜์ง€ ์•Š๊ณ ๋„) ํ•ด๋‹น User๊ฐ€ ์ ํ•ฉํ•œ ์ง€ ์ธ์ฆ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

 

JWT๋Š” 3๊ฐœ์˜ ํŒŒํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค.

header.payload.signature
  • Header : JWT๋ผ๋Š” type๊ณผ ์‚ฌ์šฉํ•˜๋Š” ํ•ด์‹œ ํ•จ์ˆ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๊ธฐ์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Payload : ์‹ค์ œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋“ค์–ด์žˆ์œผ๋ฉฐ, ์„ ํƒ์ ์œผ๋กœ expire time ๋“ฑ์ด ๋“ค์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅธ request ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ์งง๊ฒŒ ๊ตฌ์„ฑ๋˜์–ด์žˆ์œผ๋ฉฐ, ์‰ฝ๊ฒŒ decode ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋Š” ๋„ฃ์œผ๋ฉด ์•ˆ๋ฉ๋‹ˆ๋‹ค.
  • Signature : header์™€ payload ๋ฐ์ดํ„ฐ์˜ ํ•ฉ์ž…๋‹ˆ๋‹ค. JWT ๊ตฌ์กฐ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ํŒŒํŠธ๋กœ ์‰ฝ๊ฒŒ decode ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. header์™€ payload๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋Š” ์ง€ ์ฒดํฌํ•˜๊ณ  private key๋ฅผ ์ด์ค‘ ์ฒดํฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๋ฐ˜์‘ํ˜•