Web programming

์ธ์ฆ(Authentication)๊ณผ ์ธ๊ฐ€(Authorization) ๊ทธ๋ฆฌ๊ณ  ์„œ๋น„์Šค ๊ทœ๋ชจ์— ๋”ฐ๋ฅธ ์ธ์ฆ์ธ๊ฐ€ ๋ณ€์ฒœ์‚ฌ

ํ”„๋กœ๊ทธ๋ž˜๋จธ ์˜ค์›” 2025. 8. 27.

์ธ์ฆ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€

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

์˜ˆ๋ฅผ ๋“ค์–ด ์ถœ์ž…์ฆ์„ ๋ฐ›๋Š” ์ƒํ™ฉ์„ ์ƒ๊ฐํ•ด๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ถœ์ž…์ฆ์„ ํ†ตํ•ด ํ•ด๋‹น ์ธ๋ฌผ์ด ์‹ค์ œ ๊ตฌ์„ฑ์›์ธ์ง€ ์ž…์ฆํ•˜๋Š” ๊ฒƒ์ด ๊ณง ์ธ์ฆ์ž…๋‹ˆ๋‹ค.

 

์ธ์ฆ ์ฒ˜๋ฆฌ๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉด ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ 401 ์—๋Ÿฌ๋ฅผ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

401 ์—๋Ÿฌ๋Š” "๊ถŒํ•œ ์—†์Œ(Unauthorized)"์„ ์˜๋ฏธํ•˜๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ๋กœ, ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•œ ์œ ํšจํ•œ ์ธ์ฆ ์ •๋ณด(๋กœ๊ทธ์ธ ์ •๋ณด ๋“ฑ)๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. 
์ด ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž…๋ ฅํ•˜๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜, ์‚ฌ์ดํŠธ ๊ด€๋ฆฌ์ž์—๊ฒŒ ๋ฌธ์˜ํ•˜์—ฌ ๊ณ„์ • ์ ‘๊ทผ์„ ์š”์ฒญํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

  • 401 Unauthorized
    • “ํ˜„์žฌ ์š”์ฒญ์€ ์ธ์ฆ์ด ํ•„์š”ํ•˜๋‹ค”๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
    • ์ฆ‰, ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์š” ์ƒํ™ฉ
    • ๋กœ๊ทธ์ธํ•˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณดํ˜ธ๋œ API ํ˜ธ์ถœ ์‹œ๋„
    • ์ž˜๋ชป๋œ ํ† ํฐ(JWT) ๋˜๋Š” ๋งŒ๋ฃŒ๋œ ํ† ํฐ์œผ๋กœ ์š”์ฒญ
    • Authorization ํ—ค๋”๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒฝ์šฐ

 

 

์ธ๊ฐ€๋ž€ ๋ฌด์—‡์ธ๊ฐ€

์ธ๊ฐ€(Authorization)๋Š” ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์—๊ฒŒ ํŠน์ • ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ฆํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
์ฆ‰, “๋ˆ„๊ตฌ์ธ์ง€”๊ฐ€ ํ™•์ธ๋œ ๋’ค, “๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€”๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ฐ™์€ ํšŒ์‚ฌ ์ถœ์ž…์ฆ์„ ๊ฐ€์ง„ ๋‘ ์‚ฌ๋žŒ์ด๋ผ๋„, ํ•œ ๋ช…์€ 14์ธต๊นŒ์ง€๋งŒ ๊ฐˆ ์ˆ˜ ์žˆ๊ณ  ๋‹ค๋ฅธ ํ•œ ๋ช…์€ 12์ธต VIP ๊ตฌ์—ญ์—๋„ ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด, ์ด ์ฐจ์ด๊ฐ€ ์ธ๊ฐ€์ž…๋‹ˆ๋‹ค.

 

๊ถŒํ•œ์ด ํ—ˆ์šฉ ๋˜์ง€ ์•Š์œผ๋ฉด ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ 403 ์—๋Ÿฌ๋ฅผ ์‘๋‹ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

403 Forbidden ์˜ค๋ฅ˜๋Š” ํด๋ผ์ด์–ธํŠธ(์‚ฌ์šฉ์ž)๊ฐ€ ์›น ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋ƒˆ์ง€๋งŒ, ์„œ๋ฒ„๊ฐ€ ํ•ด๋‹น ์š”์ฒญ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์—†๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ ์ ‘๊ทผ์„ ๊ฑฐ๋ถ€ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” HTTP ์ƒํƒœ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๋Š” ์„œ๋ฒ„๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์ธ์‹ํ–ˆ์ง€๋งŒ, ํŠน์ • ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. 

 

  • 403 Forbidden
    • “์š”์ฒญ์€ ์ดํ•ดํ–ˆ์ง€๋งŒ, ์ธ๊ฐ€๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž๋ผ์„œ ๊ฑฐ๋ถ€ํ•œ๋‹ค”๋Š” ๋œป์ž…๋‹ˆ๋‹ค.
    • ์ฆ‰, ๋ˆ„๊ตฌ์ธ์ง€๋Š” ์•Œ์ง€๋งŒ ๊ถŒํ•œ์ด ์—†๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.
  • ์ฃผ์š” ์ƒํ™ฉ
    • ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž(USER)๊ฐ€ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€(ADMIN)์— ์ ‘๊ทผ
    • ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ ๊ถŒํ•œ์ด ์—†๋Š” ๊ณ„์ •์ด ํ•ด๋‹น ๋ฆฌ์†Œ์Šค๋ฅผ ์š”์ฒญ
    • RBAC(Role Based Access Control)์—์„œ ๊ถŒํ•œ ๋งค์นญ ์‹คํŒจ

 

 

401 vs 403 ์ฐจ์ด ์ •๋ฆฌ

 

  401 Unauthorized 403 Forbidden
๋ฌธ์ œ ์ธ์ฆ ์‹คํŒจ (๋ˆ„๊ตฐ์ง€ ๋ชจ๋ฆ„) ์ธ๊ฐ€ ์‹คํŒจ (๋ˆ„๊ตฐ์ง€๋Š” ์•„๋Š”๋ฐ ๊ถŒํ•œ ์—†์Œ)
์›์ธ ๋กœ๊ทธ์ธ ํ•„์š”, ํ† ํฐ ์—†์Œ/๋งŒ๋ฃŒ/์ž˜๋ชป๋จ ๊ถŒํ•œ(Role, Scope) ๋ถ€์กฑ
ํ•ด๊ฒฐ ์žฌ๋กœ๊ทธ์ธ, ํ† ํฐ ๊ฐฑ์‹  ํ•„์š” ๊ด€๋ฆฌ์ž ๊ถŒํ•œ ์š”์ฒญ, ๊ถŒํ•œ ์ •์ฑ… ์ˆ˜์ • ํ•„์š”
์˜ˆ์‹œ ๋งŒ๋ฃŒ๋œ JWT ํ† ํฐ ์š”์ฒญ USER ๊ถŒํ•œ์œผ๋กœ ADMIN API ํ˜ธ์ถœ

 

์›น ์„œ๋น„์Šค์—์„œ์˜ ์ ์šฉ

ํ•ญ์ƒ ์ธ์ฆ → ์ธ๊ฐ€ ์ˆœ์œผ๋กœ ์ง„ํ–‰๋ฉ๋‹ˆ๋‹ค. ์ธ์ฆ์ด ์„ ํ–‰๋˜์ง€ ์•Š์œผ๋ฉด ์ธ๊ฐ€๋Š” ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
“์ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ˆ„๊ตฌ์ธ์ง€ ๋ชจ๋ฅด๋Š” ์ƒํƒœ์—์„œ ๊ถŒํ•œ์„ ์ค„ ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ”์ž…๋‹ˆ๋‹ค.

 

  • ์ธ์ฆ: ๋กœ๊ทธ์ธ (์•„์ด๋””/๋น„๋ฐ€๋ฒˆํ˜ธ, OAuth ์†Œ์…œ ๋กœ๊ทธ์ธ, ์ธ์ฆ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜)
  • ์ธ๊ฐ€: ๊ถŒํ•œ(Role)์— ๋”ฐ๋ฅธ ์ ‘๊ทผ ์ œ์–ด (์˜ˆ: USER๋Š” ์ž์‹ ์ด ์ž‘์„ฑํ•œ ๊ธ€๋งŒ ์ˆ˜์ • ๊ฐ€๋Šฅ, ADMIN์€ ๋ชจ๋“  ๊ธ€ ์‚ญ์ œ ๊ฐ€๋Šฅ)

 

์„œ๋น„์Šค ์„ฑ์žฅ์— ๋”ฐ๋ฅธ ์ธ์ฆ·์ธ๊ฐ€์˜ ๋ณ€์ฒœ์‚ฌ

 

๊ธฐ๋ณธ ์ธ์ฆ(Basic Auth)

๋‹จ์ผ ์„œ๋ฒ„, ๋‹จ์ˆœ API์—์„œ “์ง€๊ธˆ ๋‹น์žฅ ์ธ์ฆ๋งŒ ๋˜๋ฉด ๋œ๋‹ค”๋Š” ์š”๊ตฌ์ƒํ™ฉ์„ ๋งŒ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด, ์ดˆ๊ธฐ ํ”„๋กœ์ ํŠธ ์ธ์ฆ์ธ๊ฐ€๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €/ํด๋ผ์ด์–ธํŠธ๊ฐ€ Authorization: Basic <base64(id:pw)> ํ—ค๋”๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ๋˜๋Š” ํผ ๋ฐ์ดํ„ฐ์— ๊ณ„์ • ์ •๋ณด์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณด๋‚ด๊ธฐ ๋„ ํ•˜์ฃ . ๊ตฌํ˜„์ด ๋งค์šฐ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค. ์„œ๋ฒ„๋Š” ๋งค ์š”์ฒญ๋งˆ๋‹ค ํ—ค๋”๋ฅผ ๋ณตํ˜ธํ™”ํ•˜์—ฌ DB๋กœ ๊ฒ€์ฆํ•˜๋ฉด ๋์ž…๋‹ˆ๋‹ค.

 

 

ํ•˜์ง€๋งŒ, ๋งค์šฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋‹จ์ ๊ณผ ๋ณด์•ˆ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ž๊ฒฉ์ฆ๋ช…์ด ๋ฐ˜๋ณต ์ „์†ก๋ฉ๋‹ˆ๋‹ค. ์œ ์ถœ ์‹œ ํ”ผํ•ด๊ฐ€ ํฝ๋‹ˆ๋‹ค.
  • ๋กœ๊ทธ/๋ฆฌํผ๋Ÿฌ/ํ”„๋ก์‹œ ๋“ฑ์—์„œ ํ”์ ์ด ๋‚จ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ์„ธ์…˜(์ƒํƒœ)์ด ์—†์–ด UX๊ฐ€ ๋–จ์–ด์ง€๊ณ , ๊ถŒํ•œ ๋ณ€๊ฒฝ/๋กœ๊ทธ์•„์›ƒ ์ œ์–ด๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‚ด๋ถ€๋ง ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ๋ฉด ํ”ผํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

 

ํด๋ผ์ด์–ธํŠธ ์ €์žฅ(์ฟ ํ‚ค/์Šคํ† ๋ฆฌ์ง€์— id/pw)

๋งค ์š”์ฒญ ์ž๊ฒฉ์ฆ๋ช…์„ ํƒ€์ดํ•‘ํ•˜๊ธฐ ๋ถˆํŽธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฟ ํ‚ค/๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์— id/pw๋ฅผ ๋„ฃ์–ด ์ž๋™์œผ๋กœ ๋ณด๋‚ด๋Š” ํŒจํ„ด์„ ์ผ์Šต๋‹ˆ๋‹ค.

ํ•œ ๋ฒˆ ๋กœ๊ทธ์ธํ•˜๋ฉด ๊ณ„์† ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ๋งค์šฐ ํŽธํ•˜๊ฒŒ ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋งŒํผ ํ•ด์ปค๋“คํ•œํ…Œ๋„ ํŽธํ•˜๊ฒŒ ์•…์šฉ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.

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

์ž๊ฒฉ์ฆ๋ช…์„ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅํ•˜๋Š”๊ฑด ํ•ด์ปค๋“ค์—๊ฒŒ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๊ณต๊ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์ด ์žˆ์œผ๋ฏ€๋กœ ์ œ์ผ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

 

์„œ๋ฒ„ ์„ธ์…˜(Session in App Memory)

์œ„ ํด๋ผ์ด์–ธํŠธ์— ์ž๊ฒฉ์ฆ๋ช…์„ ์ €์žฅํ•˜๋Š” ๊ฑธ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„์˜ ์„ธ์…˜ ๊ฐœ๋…์ด ๋„์ž…๋์Šต๋‹ˆ๋‹ค. “id/pw ๋Œ€์‹  ์„ธ์…˜ID๋งŒ ๊ฐ–๊ณ  ๋‹ค๋‹ˆ์ž.” ๊ทธ๋ฆฌ๊ณ  ์›น ํ†ต์‹ ์„ ํ• ๋• ์ด ์„ธ์…˜ ID ๋ฅผ ์ฃผ๊ณ ๋ฐ›์ž๋ผ๋Š” ์ทจ์ง€์ž…๋‹ˆ๋‹ค.

  • ๋กœ๊ทธ์ธ ์„ฑ๊ณต ์‹œ ์„œ๋ฒ„๊ฐ€ sessionId๋ฅผ ๋งŒ๋“ค๊ณ  ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ(in-memory)์— ์‚ฌ์šฉ์ž ์ƒํƒœ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” ์ฟ ํ‚ค๋กœ sessionId๋งŒ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—๋Š” ๋ฏผ๊ฐ ์ •๋ณด๊ฐ€ ๋‚จ์ง€ ์•Š๊ณ , ์„œ๋ฒ„์—์„œ ์„ธ์…˜ ๋งŒ๋ฃŒ/๊ฐ•์ œ ์ข…๋ฃŒ/๊ถŒํ•œ ์ฆ‰์‹œ ๋ฐ˜์˜์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฟ ํ‚ค์— HttpOnly/Secure/SameSite๋ฅผ ๋ถ™์—ฌ XSS·CSRF ๋‚ด์„ฑ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์— ์ž๊ฒฉ ์ฆ๋ช… ์ •๋ณด๋“ค์„ ๋“ค๊ณ  ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋งค์šฐ ์œ ์šฉํ•ด์กŒ์ง€๋งŒ, ๋ช‡๋ช‡ ๋ถ€์กฑํ•œ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ์„œ๋ฒ„ ์žฌ๊ธฐ๋™ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์„ธ์…˜์ด ๋ชจ๋‘ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.
  • ์ˆ˜ํ‰ ํ™•์žฅ ์‹œ ๋ฌธ์ œ๊ฐ€ ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.(๋‹จ์ผ ์ธ์Šคํ„ด์Šค/์†Œ๊ทœ๋ชจ ์„œ๋น„์Šค์—์„œ๋งŒ ์œ ์šฉ)

 

๊ณต์œ  ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€

์„œ๋น„์Šค๊ฐ€ ์ž˜ ๋˜๋ฉด ์„œ๋ฒ„๋ฅผ ๋Š˜๋ฆฝ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์„ธ์…˜ ์ผ๊ด€์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” 1๋ฒˆ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•˜๊ณ , 1๋ฒˆ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์„ธ์…˜ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜์—ฌ ์•Œ๊ณ  ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค์Œ ์š”์ฒญ์„๋ณด๋ƒˆ์„ ๋•Œ ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์— ์˜ํ•ด 2๋ฒˆ ์„œ๋ฒ„์— ์š”์ฒญ์ด ๊ฐ”๋‹ค๋ฉด, 2๋ฒˆ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ์•Œ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—  401 ์—๋Ÿฌ๋Š” ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช… ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ ๋กœ๊ทธ์ธ์„ ํ–ˆ๋Š”๋ฐ๋„ ๋ง์ด์ฃ . 

 

 

์ด๊ฑธ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด 1๋ฒˆ ์„œ๋ฒ„์— ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๋ผ๋ฉด ์•ž์œผ๋กœ ๊ณ„์† 1๋ฒˆ ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‹ฐํ‚ค ์„ธ์…˜(์„ธ์…˜ ์–ดํ”ผ๋‹ˆํ‹ฐ) ๋•๋ถ„์—  ๋‹น์žฅ์˜ ์„ธ์…˜ ์ •๋ณด๋ฅผ ๋ชป์ฐพ๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. 

 

  • ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ ๋‚ด๋ ค๊ฐ€๋ฉด ์„ธ์…˜ ์œ ์‹ค.
  • ํŠธ๋ž˜ํ”ฝ ์ ๋ฆผ·์Šค์ผ€์ผ ์ธ/์•„์›ƒ ์‹œ ์ƒํƒœ ์ด๋™์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

 

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

  • ์–ด๋А ์„œ๋ฒ„๋กœ ๊ฐ€๋“  ์„ธ์…˜์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. → ์ˆ˜ํ‰ ํ™•์žฅ ์šฉ์ด.
  • ์„ธ์…˜ ๋งŒ๋ฃŒ/๊ฐ•์ œ ์ข…๋ฃŒ/๋ธ”๋ž™๋ฆฌ์ŠคํŠธ ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ๊ณต์œ  ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ๋„์ž…ํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ์จ ๋”ฐ๋ผ์˜ค๋Š” ๋‹จ์ ๊ณผ ์ƒˆ๊ณผ์ œ๋„ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. 

 

  • ์„ธ์…˜ ์ €์žฅ์†Œ๊ฐ€ ํ•ซ ์ŠคํŒŸ/๋‹จ์ผ ์žฅ์•  ์ง€์ (SPOF) ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค → ํด๋Ÿฌ์Šคํ„ฐ๋ง, ๋ณต์ œ, ๋ชจ๋‹ˆํ„ฐ๋ง ํ•„์ˆ˜.
  • ๋ชจ๋“  ์š”์ฒญ์ด ์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ๊ฑฐ์น˜๋ฉด ๋ ˆ์ดํ„ด์‹œ·๋น„์šฉ ์ฆ๊ฐ€.
  • ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—์„œ ์„ธ์…˜ I/O๊ฐ€ ๋ณ‘๋ชฉ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

ํ† ํฐ ๊ธฐ๋ฐ˜(Stateless)์œผ๋กœ ์ „ํ™˜

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

“์„ธ์…˜ ์ƒํƒœ๋ฅผ ์ค‘์•™์— ๋‘๋Š” ๋Œ€์‹ , ์„œ๋ช…๋œ ํ† ํฐ์œผ๋กœ ์ธ์ฆ ์ •๋ณด๋ฅผ ๋“ค๊ณ  ๋‹ค๋‹ˆ์ž.” ๋ผ๋Š”  ๊ฐœ๋…์œผ๋กœ ๋‚˜์˜จ ๊ธฐ์ˆ ์ด ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ ์ธ๊ฐ€์ž…๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ช…๋œ Self-contained Token๋ฅผ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ์š”์ฒญ๋“ค์€ ์„œ๋ฒ„์—์„œ ๋‚ด๋ถ€ ์ €์žฅ์†Œ ์กฐํšŒ ์—†์ด ์‹œํฌ๋ฆฟ ํ‚ค๋กœ ํ† ํฐ ์„œ๋ช… ๊ฒ€์ฆ๋งŒ์œผ๋กœ ์ธ์ฆ์„ ๋๋ƒ…๋‹ˆ๋‹ค.

 

Self-Contained Token (์ž๊ฐ€ ํฌํ•จ ํ† ํฐ)

Self-contained ํ† ํฐ์€ ์ธ์ฆ๊ณผ ์ธ๊ฐ€์— ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๋ณ„๋„์˜ ์กฐํšŒ ์„œ๋น„์Šค ์—†์ด ํ† ํฐ ์ž์ฒด์— ๋‹ด๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. ๋ณดํ†ต JWT(JSON Web Token) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ† ํฐ์€ ๋””์ง€ํ„ธ ์„œ๋ช…์ด ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ˆ˜์‹  ์„œ๋ฒ„๋Š” ์™ธ๋ถ€ ์กฐํšŒ ์—†์ด ํ† ํฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๊ฒ€์ฆํ•˜๊ณ  ์‚ฌ์šฉ์ž ์‹ ์›๊ณผ ๊ถŒํ•œ(ํด๋ ˆ์ž„)์„ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ† ํฐ ์ž์ฒด๋กœ๋Š” ํ•ด๋…ํ•˜๊ธฐ ์‰ฌ์›Œ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ฐ™์€ ์ •๋ณด๋“ค์„ ๋‹ด์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„, ๋งŒ๋ฃŒ ๊ธฐํ•œ, ๊ถŒํ•œ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋„ฃ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Self-Contained Token์˜ ๋™์ž‘ ๋ฐฉ์‹

 

  1. ๋ฐœ๊ธ‰(Issuance)
    • ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์— ์„ฑ๊ณตํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ self-contained ํ† ํฐ์„ ๋ฐœ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‚ด์šฉ(Contents)
    • ํ† ํฐ์—๋Š” ์‚ฌ์šฉ์ž ๋˜๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์‹ ์›, ๊ถŒํ•œ, ๊ทธ๋ฆฌ๊ณ  ๊ธฐํƒ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ํ† ํฐ์˜ ๊ตฌ์กฐ ์•ˆ์— ์ธ์ฝ”๋”ฉ๋ฉ๋‹ˆ๋‹ค.
  3. ์ „๋‹ฌ(Verification)
    • ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐœ๊ธ‰๋ฐ›์€ ํ† ํฐ์„ API ์š”์ฒญ์— ํ•จ๊ป˜ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. (์ฃผ๋กœ Authenticate ํ—ค๋”) 
  4. ์„œ๋ฒ„ ์ธก ๊ฒ€์ฆ(Server-Side Validation)
    • ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›๋Š” ์„œ๋ฒ„๋Š” ํ† ํฐ์˜ ์„œ๋ช…์„ ์ง์ ‘ ๊ฒ€์ฆํ•˜๊ณ , ๋‚ด๋ถ€์— ๋‹ด๊ธด ํด๋ ˆ์ž„์„ ์ถ”์ถœํ•˜์—ฌ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๊ณ  ์ ‘๊ทผ ๊ถŒํ•œ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•ฉ๋‹ˆ๋‹ค.

 

 

์™ธ๋ถ€ ์„ธ์…˜ ์ €์žฅ์†Œ๊ฐ€ ํ•„์š” ์—†์œผ๋ฏ€๋กœ ๋ ˆ์ดํ„ด์‹œ·๋น„์šฉ ์ ˆ๊ฐ, ์žฅ์• ๋ฉด์ ์„ ์ถ•์†Œํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ  ์„œ๋ฒ„๋ฅผ ๋ฌดํ•œํžˆ ๋Š˜๋ ค๋„ ๊ทธ ์„œ๋ฒ„ ์ž์ฒด์—์„œ ์‹œํฌ๋ฆฟ ํ‚ค๋กœ ๊ฒ€์ฆ๋งŒ ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์„œ๋ฒ„ ์ˆ˜ํ‰ ํ™•์žฅ์— ์ตœ์ ์ž…๋‹ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ, ์ด์— ๋”ฐ๋ฅธ ๋ฌธ์ œ์ ๋„ ์žˆ์ฃ .

 

  • ํƒˆ์ทจ๋˜๋ฉด ๋งŒ๋ฃŒ ์ „๊นŒ์ง€ ๋ง‰๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค(์„œ๋ฒ„๊ฐ€ ์ƒํƒœ๋ฅผ ๋“ค๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ).
  • ์ฆ‰์‹œ ๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ/๊ถŒํ•œ๋ฐ•ํƒˆ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค(์ด๋ฏธ ๋ฐœ๊ธ‰๋œ ํ† ํฐ์€ ์œ ํšจ).
  • ํ† ํฐ ํฌ๊ธฐ๊ฐ€ ์ปค์ง€๋ฉด ํ—ค๋” ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ† ํฐ๋„ Access Token๊ณผ Refresh Token์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ์ธ์ฆ์ธ๊ฐ€ ๋ฐฉ์‹๋„ ํ•˜์ด๋ธŒ๋ฆฌ๋“œ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.

 

Access Token

Access Token์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ธ์ฆ์— ์„ฑ๊ณตํ–ˆ์„ ๋•Œ ๋ฐœ๊ธ‰๋˜๋Š” ์งง์€ ์ˆ˜๋ช…์˜ ํ† ํฐ์œผ๋กœ, ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผ(API)ํ•  ๋•Œ ๋งค ์š”์ฒญ๋งˆ๋‹ค ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๋Š” API ํ˜ธ์ถœ ์‹œ Authorization: Bearer <access_token> ํ—ค๋”์— ๋‹ด์•„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
  • ํƒˆ์ทจ ์œ„ํ—˜์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณดํ†ต ์ˆ˜๋ช…์ด ์งง์Šต๋‹ˆ๋‹ค. (5๋ถ„~15๋ถ„ ์ •๋„ ๊ถŒ์žฅ) 
  • ์„œ๋ฒ„๋Š” ์ถ”๊ฐ€ ์กฐํšŒ ์—†์ด ํ† ํฐ ์„œ๋ช…๋งŒ ๊ฒ€์ฆํ•˜๋ฉด ๊ถŒํ•œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ Access Token ์„์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ๋ฌด์ƒํƒœ์„ฑ์„ ๋ณด์žฅํ•˜๊ฒŒ ๋˜๊ณ , ๋ถˆํ•„์š”ํ•œ ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€ ์กฐํšŒ๋„ ํ•  ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒƒ์ด์ฃ .

 

 

Refresh Token

Refresh Token์€ Access Token์ด ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๋•Œ, ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๊ฐฑ์‹  ์š”์ฒญ ํ† ํฐ์ž…๋‹ˆ๋‹ค.

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„ ์ธก ์ €์žฅ์†Œ(์˜ˆ: Redis, DB)์— ๊ธฐ๋กํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ผ์ด์–ธํŠธ๋Š” Refresh Token์„ ๋ณด๊ด€ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ Access Token์ด ๋งŒ๋ฃŒ๋˜๋ฉด ์žฌ๋ฐœ๊ธ‰ ์š”์ฒญ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ˆ˜๋ช…์€ ๊ธธ๊ฒŒ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. (๋ฉฐ์น  ~ ๋ช‡ ์ฃผ)
  • ๋ณด์•ˆ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•ด Refresh Token ํšŒ์ „(Rotation) ๊ธฐ๋ฒ•์„ ์”๋‹ˆ๋‹ค. → ์žฌ๋ฐœ๊ธ‰ ์‹œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด Refresh Token ๋ฐœ๊ธ‰, ๊ธฐ์กด ๊ฒƒ์€ ์ฆ‰์‹œ ํ๊ธฐ. ์ด์ „ RT๊ฐ€ ๋‹ค์‹œ ์˜ค๋ฉด ํƒˆ์ทจ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ์ „์ฒด ์„ธ์…˜์„ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

 

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

 

OAuth 2.0

์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์›น์„œ๋น„์Šค๊ฐ€ ๋ฐœ์ „ํ•˜๋ฉด์„œ, ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋Š” ์„œ๋น„์Šค๋„ ์ ์  ๋งŽ์•„์กŒ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, A ์„œ๋น„์Šค๊ฐ€ ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋”์™€ ์—ฐ๋™ํ•ด ์‚ฌ์šฉ์ž์˜ ์ผ์ •์„ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ A ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž์˜ ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋”์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๊ณผ๊ฑฐ ๋ฐฉ์‹์ด๋ผ๋ฉด A ์„œ๋น„์Šค๊ฐ€ ์‚ฌ์šฉ์ž์˜ ๊ตฌ๊ธ€ ๊ณ„์ • ID์™€ PW๋ฅผ ์ง์ ‘ ๋ฐ›์•„ ์ €์žฅํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋”์— ์ ‘๊ทผํ•˜๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์—๋Š” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

  • ๋ณด์•ˆ ์œ„ํ—˜
    ์‚ฌ์šฉ์ž์˜ ๊ตฌ๊ธ€ ๊ณ„์ • ID/PW๋ฅผ A ์„œ๋น„์Šค๊ฐ€ ์ง์ ‘ ๋ณด๊ด€ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์œ ์ถœ ์‹œ ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋”๋ฟ ์•„๋‹ˆ๋ผ ๊ตฌ๊ธ€ ๋“œ๋ผ์ด๋ธŒ, ์ง€๋ฉ”์ผ ๋“ฑ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์œ„ํ—˜์— ๋…ธ์ถœ๋ฉ๋‹ˆ๋‹ค.


  • ์„œ๋น„์Šค ์šด์˜ ๋ถ€๋‹ด
    A ์„œ๋น„์Šค ์ž…์žฅ์—์„œ๋„ ํƒ€์‚ฌ ์„œ๋น„์Šค ๊ณ„์ •์„ ์ง์ ‘ ๋ณด๊ด€ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ํฐ ๋ถ€๋‹ด์ž…๋‹ˆ๋‹ค. ๋ณด์•ˆ์‚ฌ๊ณ ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์„œ๋น„์Šค ์ž์ฒด๊ฐ€ ์‹ ๋ขฐ๋ฅผ ์žƒ๊ณ  ์กด์†ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.


  • ํ”Œ๋žซํผ ์ œ๊ณต์ž ์ž…์žฅ
    ๊ตฌ๊ธ€ ๊ฐ™์€ ์„œ๋น„์Šค ์ œ๊ณต์ž ์ž…์žฅ์—์„œ๋„ ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ ์ฒด๊ณ„๋ฅผ ๋งˆ๋ จํ–ˆ๋”๋ผ๋„, ์ œ3์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ์ˆœ๊ฐ„ ๋ชจ๋“  ๋…ธ๋ ฅ์ด ๋ฌด์šฉ์ง€๋ฌผ์ด ๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฒƒ์ด OAuth 2.0์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š” ์ธ์ฆ(Authentication)์€ ์„œ๋น„์Šค ์ œ๊ณต์ž๊ฐ€ ์ง์ ‘ ํ•˜๊ณ , ์ธ๊ฐ€(Authorization, ๊ถŒํ•œ ์œ„์ž„)๋Š” ์ œ3์ž ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์œ„์ž„๋ฐ›๋„๋ก ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

 

OAuth 2.0 ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ ๊ธ€์— ๋”ฐ๋กœ ์ •๋ฆฌํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

 

์™œ “์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€(๊ณต์œ  ์„ธ์…˜)”๊ฐ€ ๋‚˜์™”๊ณ , ์™œ “ํ† ํฐ”์œผ๋กœ ๊ฐ”๋Š”๊ฐ€?

 

๋ฐฐ๊ฒฝ/๋ฌธ์ œ ์„ ํƒ ํ•ด๊ฒฐํ•œ ๊ฒƒ ๋Œ€๊ฐ€ ๋ฐ ๋ถ€์ž‘์šฉ
๋‹จ์ผ ์„œ๋ฒ„ UX·๋ณด์•ˆ ํ–ฅ์ƒ ํ•„์š” ์„œ๋ฒ„ ์„ธ์…˜(in-memory) id/pw๋ฅผ ๋“ค๊ณ  ๋‹ค๋‹ˆ์ง€ ์•Š์Œ, ๋งŒ๋ฃŒ/๊ฐ•์ œ ๋กœ๊ทธ์•„์›ƒ ๊ฐ€๋Šฅ ์žฌ๊ธฐ๋™ ์‹œ ์„ธ์…˜ ์œ ์‹ค, ์ˆ˜ํ‰ ํ™•์žฅ ํ•œ๊ณ„
๋‹ค์ค‘ ์„œ๋ฒ„/๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ๊ณต์œ  ์„ธ์…˜ ์Šคํ† ๋ฆฌ์ง€(Redis/DB) ์„œ๋ฒ„ ๊ฐ„ ์„ธ์…˜ ์ผ๊ด€์„ฑ ์ €์žฅ์†Œ๊ฐ€ ๋ณ‘๋ชฉ/ํ•ซ์ŠคํŒŸ, ๋ชจ๋“  ์š”์ฒญ I/O ์ฆ๊ฐ€
์„œ๋ฒ„๊ฐ€ ์ƒํƒœ์„ฑ์„ ๊ฐ€์ง ํ† ํฐ(JWT) ๋ฌด์ƒํƒœ ๊ฒ€์ฆ, ๋ฌดํ•œ ์ˆ˜ํ‰ ํ™•์žฅ, ์™ธ๋ถ€ ์ €์žฅ์†Œ ์ œ๊ฑฐ ์ฆ‰์‹œ ํšŒ์ˆ˜ ์–ด๋ ค์›€, ํƒˆ์ทจ ์œ„ํ—˜ → RT ํšŒ์ „/๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋กœ ๋ณด์™„
์™ธ๋ถ€ ์ž์› ์ ‘๊ทผ/SSO OAuth2 / OIDC ์ธ์ฆ·์ธ๊ฐ€ ๋ถ„๋ฆฌ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋น„๋ณด๊ด€, ๋ฒ”์œ„ ๊ธฐ๋ฐ˜ ์ ‘๊ทผ ํ”„๋กœํ† ์ฝœ ๋ณต์žก์„ฑ, ๋ณด์•ˆ ํŒŒ๋ผ๋ฏธํ„ฐ ์ค€์ˆ˜ ํ•„์š”

๊ฒฐ๊ตญ ํŠธ๋ž˜ํ”ฝ·ํ™•์žฅ์„ฑ·๋ณด์•ˆ ๋ชฉํ‘œ๊ฐ€ ๊ธฐ์ˆ  ์„ ํƒ์„ ํ•˜๊ฒŒ ๋์Šต๋‹ˆ๋‹ค.

  • ๊ณต์œ  ์„ธ์…˜์€ “๋ฉ€ํ‹ฐ ์„œ๋ฒ„์˜ ์ฒซ ๊ณ ๋น„”๋ฅผ ๋„˜๊ธฐ๊ธฐ ์œ„ํ•œ ํ•ฉ๋ฆฌ์  ํƒ€ํ˜‘์ด์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ† ํฐ์€ “๊ธ€๋กœ๋ฒŒ ํ™•์žฅ์„ฑ๊ณผ ๋ฌด์ƒํƒœ์„ฑ”์„ ์œ„ํ•œ ๋‹ค์Œ ๋‹จ๊ณ„์˜€์Šต๋‹ˆ๋‹ค.
  • OAuth/OIDC๋Š” “ํƒ€ ์„œ๋น„์Šค์™€์˜ ์•ˆ์ „ํ•œ ์œ„์ž„๊ณผ ํ†ตํ•ฉ”์„ ์œ„ํ•œ ํ‘œ์ค€์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

๋Œ“๊ธ€