๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[Spring]/Spring Security

๋‹น์‹ ์˜ ์ฒซ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ(4) - ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ๋ฐ JWT, redis ๊ฐœ๋… ์ •๋ฆฌ

by ํŒกํŽ‘ํ 2024. 9. 8.
728x90
๐Ÿ“Œ ์ด๋ฒˆ ๊ธ€์—์„œ๋Š” ์ง€๋‚œ ์‹œ๊ฐ„๊นŒ์ง€ ๋งŒ๋“  ๋‚ด์šฉ์„ ๊ฐ€๋ณ๊ฒŒ ์ •๋ฆฌํ•˜๊ณ , jwt ํ† ํฐ ๋ฐœ๊ธ‰๊ณผ redis์— ํ† ํฐ์„ ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿค— ์ €์˜ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ๊ตฌํ˜„์€ ์•„๋ž˜์™€ ๊ฐ™์€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.
- ํ”„๋ก ํŠธ ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๊ฐ€ ๋‚˜๋‰˜์–ด ์ง„ํ–‰๋˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ์„ค์ •์—์„œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์„ค์ •์„ ๋”ฐ๋กœ ํ•˜์ง€ ์•Š์Œ
- JWT ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•จ
- ํ† ํฐ ๊ด€๋ฆฌ์— Redis๋ฅผ ์ด์šฉํ•จ

 

๐Ÿ™‰ ์ด์ „ ๊ธ€ ๋ณด๊ธฐ

์ฒซ ๋ฒˆ์งธ ๊ธ€๋ถ€ํ„ฐ ์ •๋…ํ•˜์‹œ๋ฉด ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

https://suzuworld.tistory.com/438 - ๋‹น์‹ ์˜ ์ฒซ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ†บ์•„๋ณด๊ธฐ

์ด์ „ ๊ธ€

https://suzuworld.tistory.com/441 - AuthenticationManager, AuthenticationProvider, UserDetailsService, UserDetails

 

๐Ÿ“– ๋ชฉ์ฐจ

์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ ํ†บ์•„๋ณด๊ธฐ

SecurityConfig ๊ตฌ์„ฑํ•˜๊ธฐ

์ธ์ฆ ๋ฐฉ์‹ ๊ฐœ๋…๊ณผ AuthenticationFilter 

AuthenticationManager, AuthenticationProvider, UserDetailsService, UserDetails

๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ๋ฐ JWT, Redis ๊ฐœ๋… ์ •๋ฆฌ (ํ˜„์žฌ ๊ธ€)

 

๐Ÿšช๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

์ง€๋‚œ ์‹œ๊ฐ„๊นŒ์ง€์˜ ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด ๋ด…์‹œ๋‹ค.

์ง€๋‚œ ์‹œ๊ฐ„์˜ ๊ธ€๊ณผ ๊ฐ™์€ ๋‚ด์šฉ์ด๋ฏ€๋กœ ์ดํ•ดํ•˜์‹  ๋ถ„๋“ค์€ ๋„˜์–ด๊ฐ€์…”๋„ ๋ฉ๋‹ˆ๋‹ค.

  • (0) ์•„ํ‚คํ…์ฒ˜์— ๋“ฑ์žฅํ•˜์ง€ ์•Š์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ •ํ•˜๊ณ  ํšŒ์›๊ฐ€์ž…์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋Š” ํšŒ์› ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•œ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ํ•จ๊ป˜ ์ €์žฅ๋˜๋ฉฐ ์ด๋•Œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” Bcrypt๋กœ ๋‹จ๋ฐฉํ–ฅ ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • (1) Http Request๋กœ ์‚ฌ์šฉ์ž์˜ ๋กœ๊ทธ์ธ ์‹œ๋„ ์š”์ฒญ์ด ์™”์Šต๋‹ˆ๋‹ค. ์ด ์š”์ฒญ ๋ฉ”์‹œ์ง€ ์•ˆ์—๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅํ•œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค.
  • (2) AuthenticationFilter๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋กœ๊ทธ์ธ ์ •๋ณด(์•„์ด๋””, ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ UsernamePasswordAuthenticationToken์— ๋‹ด์Šต๋‹ˆ๋‹ค.
  • (3) AuthenticationManager์—๊ฒŒ ๋งค๋‹ˆ์ € ์—ญํ• ์„ ๋ถ€์—ฌํ•˜๊ณ  UsernamePasswordAuthenticationToken์„ ์ฃผ๋ฉด์„œ ๋กœ๊ทธ์ธ ๊ฒ€์ฆ์„ ํ•˜๋ผ๊ณ  ์‹œํ‚ต๋‹ˆ๋‹ค.
  • (4) AuthenticationManager๋Š” ์ง€์‹œ์ž์ด๋ฉฐ, ์‹ค์ œ ๊ฒ€์ฆ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  AuthenticationProvider์—๊ฒŒ ๋กœ๊ทธ์ธ ๊ฒ€์ฆ์„ ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ์ด ์ค‘์— DaoAuthenticationProvider๋ฅผ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.
  • (5) AuthenticationProvider๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅํ•œ ์ •๋ณด์ธ UsernamePasswordAuthenticationToken์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ํ•„์š”ํ•œ ๊ฑด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์‚ฌ์šฉ์ž์˜ ์ •๋ณด์ž…๋‹ˆ๋‹ค. ์ด ๋‘˜์„ ๋น„๊ตํ•  ๊ฒƒ์ด๋‹ˆ๊นŒ์š”.
    • ๊ทธ๋Ÿฐ๋ฐ, AuthenticationProvider๊ฐ€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜๋Š” ์ผ์„ ์ง์ ‘ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. UserDetailsService๋ผ๋Š” ๋…€์„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋“ค์–ด๊ฐ€์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋ผ๊ณ  ์‹œํ‚ต๋‹ˆ๋‹ค.(ํ•˜์ฒญ์˜ ํ•˜์ฒญ์˜ ํ•˜์ฒญ์ž…๋‹ˆ๋‹ค.)
  • (6) UserDetailsService๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ ‘๊ทผํ•˜์—ฌ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ํ•ด๋‹น ์ •๋ณด๋ฅผ UserDetails์˜ ๊ตฌํ˜„์ฒด์— ๋‹ด์•„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
  • (7) UserDetailsService๋Š” ์ด๋ฅผ AuthenticationProvider์—๊ฒŒ ์ œ๊ณตํ•˜์—ฌ ์‹ค์ œ ๋น„๊ต(๋กœ๊ทธ์ธ ๊ฒ€์ฆ)๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ ๋‚˜์˜จ ๊ฒฐ๊ณผ๊ฐ€ ๋กœ๊ทธ์ธ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์ด๋ฉฐ ์ด๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

 

์ง€๋‚œ ์‹œ๊ฐ„์— ์ด๋ฏธ ๋กœ๊ทธ์ธ์˜ ๊ธฐ๋ณธ ๊ตฌํ˜„์ด ๋๋‚ฌ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ํฌ์ŠคํŠธ ๋งจ์„ ํ†ตํ•ด ๋กœ๊ทธ์ธ์ด ๋˜๋Š”์ง€ ํ™•์ธํ•ด ๋ด…์‹œ๋‹ค!

 

๐Ÿ™†๐Ÿป‍โ™‚๏ธ ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ

MemberController

  • ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ๋งŒ๋“   ํšŒ์›๊ฐ€์ž… ๋กœ์ง์ž…๋‹ˆ๋‹ค.
  • ๋˜ํ•œ, ์ง€๋‚œ ์‹œ๊ฐ„์— ๊ธฐ์กด ํŒจ์Šค์›Œ๋“œ๋ฅผ ํ‰๋ฌธ์œผ๋กœ ์ €์žฅํ•˜๋Š” ๋กœ์ง์„ passwordEncoder๋ฅผ ํ†ตํ•ด BCypt ์•”ํ˜ธํ™”ํ•˜์—ฌ ์ €์žฅํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์—ˆ์ฃ .

 

  • ์˜ˆ์ƒ๋Œ€๋กœ ํšŒ์›๊ฐ€์ž…์ด ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„๋ฐ€๋ฒˆํ˜ธ ์—ญ์‹œ "bbb" ํ‰๋ฌธ์ด ์•”ํ˜ธํ™”๋˜์–ด ์ €์žฅ๋จ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • h2 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—๋„ ์ •์ƒ์ ์œผ๋กœ ์ €์žฅ๋˜๋„ค์š”.
  • ์ด์ œ ๋กœ๊ทธ์ธ์„ ์‹œ๋„ํ•ด ๋ด…์‹œ๋‹ค.
  • ๋กœ๊ทธ์ธ์˜ ์—”๋“œํฌ์ธํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ง€์ •ํ–ˆ์—ˆ์ฃ ?

 

SecurityConfig

  • SpringConfig์˜ scurityFilterChain์— "/login"์ด๋ผ๊ณ  ์„ค์ •ํ•ด ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ์„ค๋ช…์„ ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.
    • ์œ„์˜ "/enroll"๊ณผ "/login"์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ?
    • ์ด ๋ถ€๋ถ„์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋ฉด ์Šคํ”„๋ง MVC์˜ ๊ณต๋ถ€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • "/enroll" ์—”๋“œํฌ์ธํŠธ๋Š” ์ปจํŠธ๋กค๋Ÿฌ ์˜์—ญ์—์„œ ์ง€์ •ํ•œ ์—”๋“œํฌ์ธํŠธ์ด๋ฉฐ, "/login"์˜ ๊ฒฝ์šฐ ์ปจํŠธ๋กค๋Ÿฌ์— ๋„๋‹ฌํ•˜๊ธฐ ์ „ ํ•„ํ„ฐ์— ์ฒ˜๋ฆฌ๋˜๋Š” ์—”๋“œํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ "/login"์ด๋ผ๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ง€์ •ํ•˜์—ฌ ๋กœ์ง์„ ๋งŒ๋“ค๊ฒŒ ๋˜๋ฉด ์ถ”๊ฐ€์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜, ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ๊ณผ์ •์ด ๋ชจ๋‘ ํ•„ํ„ฐ๋‹จ์—์„œ ๋™์ž‘ํ•˜๋ฏ€๋กœ ์ปจํŠธ๋กค๋Ÿฌ์— ๋”ฐ๋กœ ๊ตฌํ˜„์„ ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์‘๋‹ต๊ฐ’์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์Šคํ”„๋ง์ด ์ œ๊ณตํ•˜๋Š” ResponseEntity ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ์ง์ ‘ ์‘๋‹ต๊ฐ’์„ ๋งŒ๋“ค์–ด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

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

 

AuthenticaionSuccessHandler & AuthenticaionFailureHandler

  • ์œ„ ๋‘ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ตฌํ˜„์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
    • ์ธ์ฆ ์„ฑ๊ณต/์‹คํŒจ์— ๋”ฐ๋ฅธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ด๋ฏธ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ด ๊ณผ์ •์€ ์ œ๊ฐ€ ์ •ํ™•ํžˆ ์ฐพ์•„๋ณด์ง€ ์•Š์•„์„œ ์ด๋ ‡๊ฒŒ ๋ฐ–์— ์„ค๋ช…์„ ๋“œ๋ฆฌ์ง€ ๋ชปํ•˜๋Š” ์  ์–‘ํ•ด ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • ์„ฑ๊ณต or ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ ๊ฐ๊ฐ ์‘๋‹ต๊ฐ’์€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋กœ๊ทธ๋งŒ ์ฐ์–ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹ค์Œ ๊ธ€์— ๋กœ๊ทธ์ธ ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์— ๋”ฐ๋ฅธ ์‘๋‹ต๊ฐ’์„ ๋งŒ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

  • ํ•ต์‹ฌ์€ passwordEncoder์˜ matches ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋กœ๊ทธ์ธ ์‹œ ์ž…๋ ฅํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์žˆ๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋น„๊ตํ•˜์—ฌ true๊ฐ€ ๋‚˜์˜ค๋ฉด ์„ฑ๊ณตํ–ˆ์„ ๋•Œ์˜ handler๋กœ ๊ฐ€๊ณ , false์ผ ๊ฒฝ์šฐ ์‹คํŒจํ–ˆ์„ ๋•Œ์˜ handler๋กœ ๊ฐ€๊ฒŒ ํ•ด์•ผ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ธ์ฝ”๋”ฉ ํ›„ matches() ๋ฉ”์„œ๋“œ๋กœ ๋น„๊ต ์‹œ true ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

 

SecurityConfig - securityFilterChain

  • SecurityConfig์˜ securityFilterChain์— jwyAuthenticationFilter์— ๋Œ€ํ•œ ์„ธํŒ… ์ •๋ณด๋ฅผ ๋งŒ๋“ค์–ด๋‘์—ˆ๋Š”๋ฐ์š”. ์—ฌ๊ธฐ์„œ ์œ„์— ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ ์„ฑ๊ณต ํ•ธ๋“ค๋Ÿฌ์™€ ์‹คํŒจ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’™ ๋กœ๊ทธ์ธ ์‹œ๋„

  • ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž…๋ ฅํ–ˆ์„ ๊ฒฝ์šฐ์—๋Š” ์„ฑ๊ณต ํ•ธ๋“ค๋Ÿฌ๋กœ ๋น ์ ธ "๋กœ๊ทธ์ธ ์„ฑ๊ณต!"์ด๋ž€ ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๊ณ , ํ‹€๋ฆฌ๊ฒŒ ์ž…๋ ฅํ–ˆ์„ ๋•Œ๋Š” ์‹คํŒจ ํ•ธ๋“ค๋Ÿฌ๋กœ ๋น ์ ธ "๋กœ๊ทธ์ธ ์‹คํŒจ!"๋ž€ ๋กœ๊ทธ๊ฐ€ ์ฐํž˜์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๊ณ  ๋‘˜ ๋‹ค ์‘๋‹ต์€ 200์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”‘ JWT ๋ฐœ๊ธ‰๊ณผ ๊ด€๋ฆฌ

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

 

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

 

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

 

โš™๏ธ JWT์˜ ๋™์ž‘ ์›๋ฆฌ

์—ฌ๊ธฐ์„  ๊ฐ„๋‹จํžˆ ์š”์•ฝ๋œ ๋‚ด์šฉ์„ ์„ค๋ช…๋“œ๋ฆฌ๋‹ˆ JWT์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋‚˜ ์ž์„ธํ•œ ๋‚ด์šฉ์ด ๊ถ๊ธˆํ•˜์‹  ๋ถ„๋“ค์€ ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ํ•ด๊ฒฐํ•ด ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

JWT์—๋Š” Access Token๊ณผ Refresh Token์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

๋กœ๊ทธ์ธ์ด ์„ฑ๊ณตํ•˜์—ฌ ์ด ๋‘ ๊ฐœ์˜ ํ† ํฐ์ด ๋ฐœ๊ธ‰์ด ๋˜๋ฉด ์„œ๋ฒ„์—์„œ๋Š” ์‘๋‹ต๊ฐ’์œผ๋กœ ํด๋ผ์ด์–ธํŠธ์— ํ† ํฐ์„ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

Access Token์€ ์œ ํšจ ์‹œ๊ฐ„์ด ์งง์€ ํŽธ์ด๋ฉฐ, Refresh Token์€ Access Token์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ์œ ํšจ ์‹œ๊ฐ„์ด ๊น๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐœ๊ธ‰๋ฐ›์€ Access Token์œผ๋กœ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค.

Access Token์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ๋Š” Access Token์ด ๋งŒ๋ฃŒ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์—๋Ÿฌ ์‘๋‹ต์„ ๋ฆฌํ„ดํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ณดํ†ต์€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋จผ์ € Access Token์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Œ์„ ๊ฐ์ง€ํ•˜๊ณ , ์„œ๋ฒ„์— Refresh Token์„ ํฌํ•จํ•˜์—ฌ ์ƒˆ๋กœ์šด Access Token์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ์—์„œ Access Token ์žฌ๋ฐœ๊ธ‰์„ ์œ„ํ•ด Refresh Token์„ ๋ณด๋‚ด ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด Access Token์„ ๋ฐœ๊ธ‰๋ฐ›๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด๋ฅผ ๋ช…์‹œ์  Refresh Token ์š”์ฒญ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ด๋•Œ, Refresh Token์˜ ์œ ํšจ ์‹œ๊ฐ„๋„ ๋๋‚˜๊ฒŒ ๋˜๋ฉด ์žฌ๋กœ๊ทธ์ธ์„ ํ†ตํ•ด ๋‘ ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰๋ฐ›์Šต๋‹ˆ๋‹ค.

 

์ž๋™์œผ๋กœ Refresh Token์„ ์š”์ฒญํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์— Access Token๊ณผ Refresh Token์„ ์‹ฃ๊ณ  ์„œ๋ฒ„์—๊ฒŒ Access Token์˜ ์œ ํšจ ์‹œ๊ฐ„ ์ฒดํฌ๋ฅผ ๋งก๊ฒจ ๋งŒ๋ฃŒ๋˜์—ˆ์„ ๊ฒฝ์šฐ ํ•จ๊ป˜ ๋ณด๋‚ธ Refresh Token์œผ๋กœ Access Token์„ ์žฌ๋ฐœ๊ธ‰ ์ฒ˜๋ฆฌํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์ผ๋ฐ˜์ ์œผ๋กœ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์ธ ๋ช…์‹œ์  Refresh Token ์š”์ฒญ์ด ๋” ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. 

์ด ๋ฐฉ๋ฒ•์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Access Token์˜ ๋งŒ๋ฃŒ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ Refresh Token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด Access Token์„ ์š”์ฒญํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ถˆํ•„์š”ํ•œ ์š”์ฒญ์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค ์š”์ฒญ๋งˆ๋‹ค Refresh Token์„ ์ „์†กํ•˜๋Š” ๊ฒƒ์€ ๋ณด์•ˆ์ƒ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Refresh Token์„ ์‚ฌ์šฉํ•˜๋Š” ์˜๋ฏธ๊ฐ€ ํ‡ด์ƒ‰๋ฉ๋‹ˆ๋‹ค.

๋ณด์•ˆ๊ณผ ํšจ์œจ์„ฑ์„ ๊ณ ๋ คํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

 

๐Ÿ‘ฎ๐Ÿป‍โ™‚๏ธ ํ† ํฐ์˜ ๊ตฌ์กฐ์™€ ๊ด€๋ฆฌ

ํ† ํฐ ๊ตฌ์กฐ

Access Token

  • ์ผ๋ฐ˜์ ์œผ๋กœ JWT(JSON Web Token) ํ˜•์‹์œผ๋กœ ๋ฐœ๊ธ‰๋ฉ๋‹ˆ๋‹ค.
  • JWT๋Š” ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค: Header, Payload, Signature
  • ๊ฐ ๋ถ€๋ถ„์€ ์ (.)์œผ๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ „์ฒด JWT๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•์‹์œผ๋กœ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

 

JWT ์›น์‚ฌ์ดํŠธ์—์„œ ๋””์ฝ”๋”ฉํ•ด ๋ณด๊ธฐ

https://jwt.io/

  • ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ์„ธ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋‰˜์–ด ์žˆ์œผ๋ฉฐ ๋””์ฝ”๋”ฉ ์‹œ ๊ฐ ์„ธ ๋ถ€๋ถ„์— ๋“ค์–ด์žˆ๋Š” ๋‚ด์šฉ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Header

  • JWT์˜ ํƒ€์ž…๊ณผ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ตฌ์„ฑ: ์ผ๋ฐ˜์ ์œผ๋กœ JSON ๊ฐ์ฒด๋กœ ๊ตฌ์„ฑ๋˜๋ฉฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
    • alg: ์‚ฌ์šฉ๋œ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜ (์˜ˆ: HMAC SHA256, RSA ๋“ฑ)
    • typ: ํ† ํฐ์˜ ํƒ€์ž… (๋ณดํ†ต "JWT"๋กœ ์„ค์ •)

Payload 

  • ํ† ํฐ์— ๋‹ด๊ธธ ํด๋ ˆ์ž„(claims)์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ ˆ์ž„์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋‚˜ ๊ถŒํ•œ, ํ† ํฐ์˜ ์œ ํšจ ๊ธฐ๊ฐ„ ๋“ฑ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
    • iss(๋ฐœ๊ธ‰์ž), exp(๋งŒ๋ฃŒ ์‹œ๊ฐ„), sub(์ฃผ์ œ), aud(๋Œ€์ƒ) ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Signature

  • JWT์˜ ๋ฌด๊ฒฐ์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ํ† ํฐ์ด ๋ณ€์กฐ๋˜์ง€ ์•Š์•˜์Œ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
  • Header์™€ Payload๋ฅผ ์ธ์ฝ”๋”ฉํ•œ ํ›„, ๋น„๋ฐ€ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ช… ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ๋”ฐ๋ผ ์„œ๋ช…ํ•ฉ๋‹ˆ๋‹ค.
    • ์—ฌ๊ธฐ์„œ ๋น„๋ฐ€ ํ‚ค๋Š” ์„œ๋ฒ„์—์„œ ์ž„์˜๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์€ ๊ตฌํ˜„ ๊ณผ์ •์— ์ž์„ธํžˆ ๋ณด์—ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • ์ด ๊ณผ์ •์—์„œ ์‚ฌ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์œ„์— Header์— ๋ช…์‹œ๋œ alg์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

๋ณต์žกํ•˜๋‹ค๊ณ  ๋Š๋ผ๊ฒ ์ง€๋งŒ ์Šคํ”„๋ง ์‹œํ๋ฆฌํ‹ฐ์—์„œ ๋งŽ์€ ๋ถ€๋ถ„์„ ์ž๋™์œผ๋กœ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์„œ๋Š” ๊ฐœ๋…๋งŒ ์‚ดํŽด๋ณด๊ณ  ์‹ค์ œ๋กœ ๊ตฌํ˜„์„ ํ†ตํ•ด ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐ€๋ณ๊ฒŒ ์ฝ์–ด๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค!

๋นจ๊ฐ„์ƒ‰์œผ๋กœ ํ‘œ์‹œํ•œ ๋ถ€๋ถ„์ด ํ•ต์‹ฌ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.

Refresh Token

  • Refresh Token์˜ ๊ตฌ์กฐ ์—ญ์‹œ JWT๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • Access Token์˜ ์žฌ๋ฐœ๊ธ‰์— ๋ชฉ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ ˆ์ž„ ๋“ฑ์˜ ๋‚ด์šฉ์ด Access Token๊ณผ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ๋˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜๊ธฐ๋„ ํ•˜์ง€๋งŒ, ์—ฌ๊ธฐ์„œ๋Š” redis์— ์ €์žฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

 

๊ฒ€์ฆ ๊ณผ์ •

Access Token ๊ฒ€์ฆ

Signature ๊ฒ€์ฆ

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

์œ ํšจ ๊ธฐ๊ฐ„ ํ™•์ธ

  • Payload์— ํฌํ•จ๋œ exp(๋งŒ๋ฃŒ ์‹œ๊ฐ„) ํ•„๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ํ† ํฐ์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

๋ฐœ๊ธ‰์ž ํ™•์ธ

  • Payload์— ํฌํ•จ๋œ iss(๋ฐœ๊ธ‰์ž) ํ•„๋“œ๋ฅผ ํ™•์ธํ•˜์—ฌ ํ•ด๋‹น ํ† ํฐ์ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋ฒ„์—์„œ ๋ฐœ๊ธ‰๋œ ๊ฒƒ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

Refresh Token ๊ฒ€์ฆ

๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

  • Refresh Token์€ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ Refresh Token์„ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์—์„œ ์กฐํšŒํ•˜์—ฌ ํ•ด๋‹น ํ† ํฐ์ด ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ๋Š” RDBMS์ผ์ˆ˜๋„ ์žˆ๊ณ , redis, memcached์™€ ๊ฐ™์€ ์ธ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ํšจ์„ฑ ํ™•์ธ

  • redis์—์„œ ์กฐํšŒํ•œ Refresh Token์ด ์œ ํšจํ•œ์ง€, ๋งŒ๋ฃŒ๋˜์—ˆ๋Š”์ง€, ๋˜๋Š” ์ด๋ฏธ ์‚ฌ์šฉ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ Refresh Token์€ ํ•œ ๋ฒˆ ์‚ฌ์šฉ๋˜๋ฉด ๋ฌดํšจํ™”๋˜๋„๋ก ์„ค๊ณ„๋˜์ง€๋งŒ ๊ตฌํ˜„ํ•˜๊ธฐ ๋‚˜๋ฆ„์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ •๋ณด ํ™•์ธ

  • Redis์—์„œ Refresh Token๊ณผ ํ•จ๊ป˜ ์ €์žฅ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด(์˜ˆ: ์‚ฌ์šฉ์ž ID)๋ฅผ ํ™•์ธํ•˜์—ฌ, ํ•ด๋‹น ํ† ํฐ์ด ์–ด๋–ค ์‚ฌ์šฉ์ž์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

 

๐ŸŸฅ redis

  • redis๋Š” ์˜คํ”ˆ ์†Œ์Šค ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์ €์žฅ์†Œ๋กœ ์ฃผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์บ์‹œ, ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ์ปค๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • Redis๋Š” ํ‚ค-๊ฐ’ ์ €์žฅ์†Œ๋กœ ์ž‘๋™ํ•˜๋ฉฐ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ(๋ฌธ์ž์—ด, ํ•ด์‹œ, ๋ฆฌ์ŠคํŠธ, ์…‹ ๋“ฑ)๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋†’์€ ์†๋„๋ฅผ ์ž๋ž‘ํ•ฉ๋‹ˆ๋‹ค.

 

Refresh Token์„ ๊ด€๋ฆฌํ•  ๋•Œ RDBMS๊ฐ€ ์•„๋‹Œ Redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 

  • ์œ„์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Refresh Token์„ ๊ด€๋ฆฌํ•  ๋•Œ ๊ธฐ์กด์— ์‚ฌ์šฉ ์ค‘์ธ RDBMS(ex. mysql)์ด ์•„๋‹Œ redis๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ƒ๊ฐํ•ด ๋ณด๋ฉด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์˜ ์—ญํ• ์„ ํ•˜๋Š” ๋ฌด์—‡์ด๋“  Refresh Token์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ทธ๋Ÿฐ๋ฐ, ์™œ redis๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ผ๊นŒ์š”?

์†๋„

  • redis๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ์†๋„๊ฐ€ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค.
  • Refresh Token์˜ ๊ฒ€์ฆ ๋ฐ ๋ฐœ๊ธ‰ ๊ณผ์ •์—์„œ ๋น ๋ฅธ ์‘๋‹ต์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Redis๊ฐ€ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

TTL(์‹œ๊ฐ„ ์ œํ•œ)

  • Redis๋Š” ๊ฐ ํ‚ค์— ๋Œ€ํ•ด TTL์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด Refresh Token์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋งŒ๋ฃŒ๋œ ํ† ํฐ์€ redis์—์„œ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜๋ฏ€๋กœ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค.

๋น„์šฉ ํšจ์œจ์„ฑ

  • redis๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์ฃผ ์ ‘๊ทผํ•˜๋Š” ๋ฐ์ดํ„ฐ(์˜ˆ: Refresh Token)๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ ๋น„์šฉ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • RDBMS๋Š” ๋””์Šคํฌ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž์ฃผ ์ฝ๊ณ  ์“ฐ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ๊ธฐ์กด์˜ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ JPA ๋“ฑ๊ณผ ๊ฐ™์€ ์ฟผ๋ฆฌ๋ฌธ์„ ๋‚ ๋ฆฌ๋Š” ๋ฐ์—๋„ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š”๋ฐ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ ํ•˜๋‚˜๋ฅผ ์œ„ํ•ด RDBMS์— ์ €์žฅํ•˜๋Š” ๊ฑด ๋น„ํšจ์œจ์ ์ด๋ผ๊ณ  ๋ด…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ

  • Refresh Token์€ ๊ฐ„๋‹จํ•œ ํ‚ค-๊ฐ’ ์Œ์œผ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด redis์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์™€ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค. RDBMS์—์„œ๋Š” ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ณต์žกํ•œ ํ…Œ์ด๋ธ” ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๐Ÿ‘จ๐Ÿป‍๐Ÿ’ป ๋‹ค์Œ ์‹œ๊ฐ„

  • ์„œ๋ฒ„์—์„œ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋ฉด์„œ JWT์™€ redis์— ๋Œ€ํ•ด ์ž์„ธํžˆ ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
728x90