๐Ÿ” OAuth 2.0์—์„œ Authorization Code์™€ PKCE

NTbellยท2025๋…„ 1์›” 4์ผ

๐Ÿšฉ Authorization Code์ด๋ž€?

๐Ÿ”ธ Authorization Code โ€“ ํ† ํฐ์ด ์•„๋‹ˆ๋ผ, ํ† ํฐ์„ ์–ป๊ธฐ ์œ„ํ•œ ์ž„์‹œ ์ฝ”๋“œ์ž„


โœ… OAuth 2.0 & OIDC ๋กœ๊ทธ์ธ ํ๋ฆ„

์ด ํ๋ฆ„์€ OAuth 2.0์˜ ํ‘œ์ค€ ํ๋ฆ„์œผ๋กœ,
๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ์นด์นด์˜ค, ์• ํ”Œ ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ OAuth ์ธ์ฆ ์ œ๊ณต์ž(IdP)์—์„œ ์œ ์‚ฌํ•˜๊ฒŒ ์‚ฌ์šฉ๋จ

๐Ÿ”น ๊ตฌ๊ธ€, ์• ํ”Œ โ€“ OAuth 2.0 + OpenID Connect (OIDC)๋ฅผ ์‚ฌ์šฉ
๐Ÿ”น ๋„ค์ด๋ฒ„, ์นด์นด์˜ค, ํŽ˜์ด์Šค๋ถ โ€“ ๋Œ€๋ถ€๋ถ„ OAuth 2.0๋งŒ ์‚ฌ์šฉ (ID Token ๋ฐ˜ํ™˜ X ๋˜๋Š” ์„ ํƒ)


๐Ÿšฉ OAuth 2.0 ํ‘œ์ค€ ๋กœ๊ทธ์ธ ํ๋ฆ„ (Access Token ์ค‘์‹ฌ)

๋ชจ๋“  OAuth 2.0 ์ธ์ฆ ์ œ๊ณต์ž(IdP)์— ์ ์šฉ ๊ฐ€๋Šฅ

  1. ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ(์›น/์•ฑ)์—์„œ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ
  2. ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž๋ฅผ OAuth ์„œ๋ฒ„(๋„ค์ด๋ฒ„, ์นด์นด์˜ค, ํŽ˜์ด์Šค๋ถ ๋“ฑ)๋กœ ๋ฆฌ๋””๋ ‰ํŠธ
  3. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ โ†’ Authorization Code ๋ฐ˜ํ™˜
  4. ํด๋ผ์ด์–ธํŠธ๋Š” Authorization Code๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†ก
  5. ์„œ๋ฒ„๋Š” Authorization Code๋กœ Access Token ์š”์ฒญ(Client Secret๊ฐ™์ด ๋ณด๋ƒ„)
  6. OAuth ์„œ๋ฒ„๊ฐ€ Access Token ๋ฐ˜ํ™˜
  7. ์„œ๋ฒ„๋Š” Access Token์„ ์‚ฌ์šฉํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด API ํ˜ธ์ถœ

๐Ÿšฉ ๊ตฌ๊ธ€/์• ํ”Œ ๋กœ๊ทธ์ธ ํ๋ฆ„ (OIDC ๊ธฐ๋ฐ˜)

๊ตฌ๊ธ€, ์• ํ”Œ ๋“ฑ OpenID Connect(OIDC)๋ฅผ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค์— ํ•ด๋‹น๋จ

  1. ์‚ฌ์šฉ์ž๊ฐ€ ํด๋ผ์ด์–ธํŠธ(์›น/์•ฑ)์—์„œ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ ํด๋ฆญ
  2. ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์šฉ์ž๋ฅผ ๊ตฌ๊ธ€ OIDC ์„œ๋ฒ„๋กœ ๋ฆฌ๋””๋ ‰ํŠธ
  3. ์‚ฌ์šฉ์ž๊ฐ€ ๊ตฌ๊ธ€์— ๋กœ๊ทธ์ธ โ†’ Authorization Code ๋ฐ˜ํ™˜
  4. ํด๋ผ์ด์–ธํŠธ๋Š” Authorization Code๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†ก
  5. ์„œ๋ฒ„๋Š” Authorization Code๋กœ Access Token + ID Token ์š”์ฒญ
  6. ๊ตฌ๊ธ€์ด ์„œ๋ฒ„์— Access Token + ID Token(JWT) ๋ฐ˜ํ™˜
  7. ์„œ๋ฒ„๋Š” ID Token์„ ๋””์ฝ”๋”ฉํ•ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ถ”์ถœํ•˜๊ณ ,
    ์ž์ฒด์ ์œผ๋กœ JWT๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์„ธ์…˜ ๊ด€๋ฆฌ

๐Ÿšฉ PKCE(Proof Key for Code Exchange)๋ž€?

PKCE๋Š” ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ์„ ์ €์žฅํ•  ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐฉ์‹์ž„

๐Ÿ“Œ PKCE๊ฐ€ ํ•„์š”ํ•œ ์ด์œ 

  • SPA (React, Vue ๋“ฑ)
  • ๋ชจ๋ฐ”์ผ ์•ฑ
  • ๋ฐ์Šคํฌํ†ฑ ์•ฑ

๐Ÿ‘‰ ๊ณต๊ฐœ ํด๋ผ์ด์–ธํŠธ(Public Client)์—์„œ๋Š” Client Secret์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ํ•  ์ˆ˜ ์—†์Œ
๐Ÿ‘‰ Authorization Code ํƒˆ์ทจ ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— PKCE๊ฐ€ ํ•„์š”ํ•จ


โœ… PKCE ์ธ์ฆ ํ๋ฆ„

  1. ํด๋ผ์ด์–ธํŠธ๋Š” Authorization ์š”์ฒญ ์ „์— code_challenge ์ƒ์„ฑ
  2. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ โ†’ Authorization Code ๋ฐ˜ํ™˜
  3. ํด๋ผ์ด์–ธํŠธ๋Š” Authorization Code์™€ ํ•จ๊ป˜ code_verifier ์ „์†ก
  4. ๊ตฌ๊ธ€์€ code_verifier ๊ฒ€์ฆ ํ›„ Access Token + ID Token ๋ฐœ๊ธ‰

๐Ÿšฉ ํ๋ฆ„ ๋น„๊ต

PKCE ์—†๋Š” ๊ฒฝ์šฐPKCE ์žˆ๋Š” ๊ฒฝ์šฐ
Authorization Code ํƒˆ์ทจ ๊ฐ€๋Šฅcode_verifier๋กœ ํƒˆ์ทจ ๋ฐฉ์ง€
ํ† ํฐ ๊ตํ™˜ ์‹œ ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ ํ•„์š”ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ ์—†์ด๋„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ตํ™˜

โœ… PKCE ์—†๋Š” ๊ฒฝ์šฐ ์œ„ํ—˜์„ฑ

๐Ÿ”ธ Authorization Code๊ฐ€ ๊ณต๊ฒฉ์ž์—๊ฒŒ ํƒˆ์ทจ๋  ๊ฒฝ์šฐ
๐Ÿ”ธ ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์„ฑ ํด๋ผ์ด์–ธํŠธ์—์„œ Access Token ๊ตํ™˜ ๊ฐ€๋Šฅ


โœ… ์„œ๋ฒ„์‚ฌ์ด๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ PKCE ํ•„์š” ์—†์Œ

๐Ÿ”น ์„œ๋ฒ„์‚ฌ์ด๋“œ ์›น ์•ฑ(Spring Boot ๋“ฑ)์€ Client Secret์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
๐Ÿ”น ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ Authorization Code๋งŒ ๋ฐ›์•„ ์„œ๋ฒ„์—์„œ ์ง์ ‘ ํ† ํฐ ๊ตํ™˜
๐Ÿ”น ํ† ํฐ ์š”์ฒญ ์‹œ Client Secret ์‚ฌ์šฉ โ†’ ๋ธŒ๋ผ์šฐ์ €์—๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ


โœ… ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ(Client Secret)์ด๋ž€?

๐Ÿ”ธ OAuth 2.0์—์„œ ์„œ๋ฒ„์™€ ์ธ์ฆ ์ œ๊ณต์ž ๊ฐ„ ์‹ ๋ขฐ๋ฅผ ์ฆ๋ช…ํ•˜๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๊ฐ™์€ ์—ญํ• 
๐Ÿ”ธ Access Token ์š”์ฒญ ์‹œ ์‚ฌ์šฉ
๐Ÿ”ธ ์„œ๋ฒ„์—์„œ๋งŒ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณด๊ด€ โ†’ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—๋Š” ์ ˆ๋Œ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์Œ


๐Ÿ“Œ ํด๋ผ์ด์–ธํŠธ ์‹œํฌ๋ฆฟ์˜ ์—ญํ• 

  1. ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ โ†’ Authorization Code ๋ฐœ๊ธ‰
  2. ์„œ๋ฒ„๊ฐ€ Authorization Code + Client Secret์œผ๋กœ ํ† ํฐ ์š”์ฒญ
  3. ๊ตฌ๊ธ€์ด Client Secret ๊ฒ€์ฆ ํ›„ Access Token ๋ฐœ๊ธ‰
  4. Authorization Code ํƒˆ์ทจ๋˜๋”๋ผ๋„ Client Secret ์—†์œผ๋ฉด ํ† ํฐ ๋ฐœ๊ธ‰ ๋ถˆ๊ฐ€

๐Ÿšฉ PKCE๊ฐ€ ๊ผญ ํ•„์š”ํ•œ ํ™˜๊ฒฝ

  • SPA (Single Page Application) โ€“ React, Vue, Angular
  • ๋ชจ๋ฐ”์ผ ์•ฑ โ€“ iOS, Android
  • ๋ฐ์Šคํฌํ†ฑ ์•ฑ โ€“ Electron, PWA

๐Ÿ‘‰ Client Secret์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์—†๋Š” ํ™˜๊ฒฝ์—์„œ๋Š” PKCE๊ฐ€ ํ•„์ˆ˜์ž„


์ฆ‰,

  • SPA, ๋ชจ๋ฐ”์ผ, ๋ฐ์Šคํฌํ†ฑ ์•ฑ โ€“ PKCE ํ•„์ˆ˜!
  • ์„œ๋ฒ„์‚ฌ์ด๋“œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Spring Boot ๋“ฑ) โ€“ PKCE ๋ถˆํ•„์š” (Client Secret์ด ์„œ๋ฒ„์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅ๋จ)
profile
์–ด๋–ค ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์‹ถ๋‚˜

0๊ฐœ์˜ ๋Œ“๊ธ€