Refresh Token Rotation ๊ณผ Redis๋กœ ํ† ํฐ ํƒˆ์ทจ ์‹œ๋‚˜๋ฆฌ์˜ค ๋Œ€์‘

2023. 4. 21. 15:33ใ†๐ŸŒ Web

I. ์„œ๋ก 

  • JWT์™€ Session ๋น„๊ต ๋ฐ JWT์˜ ์žฅ์  ์†Œ๊ฐœ

II. ๋ณธ๋ก 

  • Access Token๊ณผ Refresh Token์˜ ๋„์ž… ์ด์œ  Refresh Token ์€ ์–ด๋–ป๊ฒŒ Access Token์˜ ์žฌ๋ฐœ๊ธ‰์„ ๋„์™€์ฃผ๋Š” ๊ฑธ๊นŒ?
  • Refresh Token Rotation Redis ์ €์žฅ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

III. ๊ฒฐ๋ก 

  • ์ •๋ฆฌ
  • ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

ํ•ด๊ฒฐํ•˜๊ณ ์ž ํ•œ ๋ฌธ์ œ

JWT๋กœ ์ธ์ฆ์„ ๊ตฌํ˜„ํ•œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์•„๋ž˜์˜ ๋ฌธ์ œ๋ฅผ ์ƒ๊ฐํ•ด ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

1. ์œ ํšจ๊ธฐ๊ฐ„์ด ๊ธด Refresh Token์ด ํƒˆ์ทจ๋œ ๊ฒฝ์šฐ.

-> ์ด ๊ฒฝ์šฐ๋Š” ๊ฐ„๋‹จํžˆ refresh token rotation ์„ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์•„๋ž˜์˜ ๋ฌธ์ œ๊นŒ์ง€ ์ปค๋ฒ„ํ•  ์ˆ˜ ์žˆ์„์ง„ ์˜๋ฌธ์ด๋‹ค.

 

2. ํƒˆ์ทจํ•œ Refresh Token์œผ๋กœ ์ •์ƒ ์œ ์ €๋ณด๋‹ค ๋จผ์ € Access Token์„ ์žฌ๋ฐœ๊ธ‰๋ฐ›๋Š” ๊ฒฝ์šฐ

-> Refresh Token Rotation ํ•ด๋„, ์ •์ƒ์œ ์ €๋ณด๋‹ค ๋จผ์ € refresh token์„ ์žฌ๋ฐœ๊ธ‰๋ฐ›์œผ๋ฉด ์–ด๋–กํ•  ๊ฒƒ์ธ๊ฐ€?

 

3. (ํ† ํฐ ํƒˆ์ทจ๋œ ๊ฒฝ์šฐ) ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž์— refresh token์ด ์—ฌ๋Ÿฌ๊ฐœ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ

์ž๋™ ๋กœ๊ทธ์ธ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ์œ„ 3๊ฐ€์ง€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ–ˆ๋Š”์ง€ ๋‹จ๊ณ„์ ์œผ๋กœ ํ’€์–ด๋ณด๊ฒ ๋‹ค.

 

 

I. ์„œ๋ก 

JWT์™€ Session ๋น„๊ต ๋ฐ JWT์˜ ์žฅ์  ์†Œ๊ฐœ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์„ ํƒํ•œ ์ด์œ 

์ธ์ฆ(Authorization)์€ ํฌ๊ฒŒ ์„ธ์…˜๊ณผ ํ† ํฐ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค. ๊ฐ„๋žตํ•˜๊ฒŒ ๋‘ ๋ฐฉ์‹์˜ ํŠน์ง•์„ ์•Œ์•„๋ณด์ž๋ฉด,

 

1) ์„ธ์…˜ ๊ธฐ๋ฐ˜

์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๊ฐ€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ(=์„ธ์…˜ ์ €์žฅ์†Œ)์— ์ €์žฅ๋˜๋Š” ๋ฐฉ์‹. ์—ฌ๊ธฐ์„œ ๋ฉ”๋ชจ๋ฆฌ๋ž€ Database๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ ์ž์ฒด์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋กœ๊ทธ์ธ ์‹œ ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ์ •๋ณด๋ฅผ ์„ธ์…˜ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๊ณ  Session ID ๋ผ๋Š” ์‹๋ณ„์ž๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐœ๊ธ‰ํ•œ๋‹ค.

ํด๋ผ์ด์–ธํŠธ(์‚ฌ์šฉ์ž)๊ฐ€ HTTP Cookie Header์— Session ID๋ฅผ ์ €์žฅํ•˜์—ฌ ์ „์†กํ•˜๋ฉด, ์„œ๋ฒ„๋Š” ์ „๋‹ฌ๋ฐ›์€ Session ID๋กœ ์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ์กฐํšŒํ•˜์—ฌ ์‚ฌ์šฉ์ž๋ฅผ ๊ฒ€์ฆํ•œ๋‹ค.

์ฆ‰ ์„ธ์…˜ ๊ธฐ๋ฐ˜์˜ ํŠน์ง•์€ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๊ฐ€ ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณด๊ด€ ๋œ๋‹ค๋Š” ์ ์ด๋‹ค.

 

2) ํ† ํฐ ๊ธฐ๋ฐ˜

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

์ด ํ† ํฐ์€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ƒ์„ฑ๋˜์–ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š”๋ฐ, ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด(์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ, id๊ฐ’ ๋“ฑ)๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” HTTP ์š”์ฒญ ์‹œ Authorization Header์— ํ† ํฐ์„ ๋‹ด์•„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๋Š” ํ† ํฐ์˜ ์œ ํšจ๊ธฐ๊ฐ„๊ณผ ์œ ํšจ์„ฑ์„ ๊ฒ€์ฆํ•˜์—ฌ ํ† ํฐ์˜ ์ •๋ณด๋ฅผ ํ’€์–ด ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ธ์ฆํ•œ๋‹ค.

์ฆ‰ ํ† ํฐ ๊ธฐ๋ฐ˜์˜ ํŠน์ง•์€, ์„ธ์…˜ ๊ธฐ๋ฐ˜๊ณผ ๋‹ฌ๋ฆฌ ๋ณ„๋„๋กœ ์„ธ์…˜์„ ์ €์žฅํ•  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค. ๊ทธ์ € ํ† ํฐ์„ ์ƒ์„ฑํ•˜๊ณ , ์ „๋‹ฌ๋ฐ›์€ ํ† ํฐ์„ ๋‹ค์‹œ resolve ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๋งŒ ๊ฐ–์ถ”๋ฉด ๋œ๋‹ค.

 

๋‘ ๋ฐฉ์‹์˜ ์ฐจ์ด์ 

์šฐ์„  ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ณด์œ ํ•œ ์œ„์น˜์˜ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

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

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

 

์œ„์˜ ์ด์œ ๋กœ ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ํƒํ–ˆ๊ณ , ๋Œ€ํ‘œ์ ์ธ ํ† ํฐ ์ธ์ฆ ๋ฐฉ์‹์ธ JWT๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

 

II. ๋ณธ๋ก 

JWT : Access Token๊ณผ Refresh Token์˜ ๋„์ž… ์ด์œ 

์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ธ์ฆํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  ํ•˜๋‚˜์˜ ํ† ํฐ๋งŒ ์žˆ์œผ๋ฉด ๋œ๋‹ค.

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

์‚ฌ์šฉ์ž A๋Š” ์ž์‹ ์˜ ํ† ํฐ(T1) ์„ ์‚ฌ์šฉํ•ด์„œ ์„œ๋ฒ„ ์ธ์ฆ์„ ์š”์ฒญํ•œ๋‹ค.

 

Access Token

Access Token ์€ ์‚ฌ์šฉ์ž ์ธ์ฆ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค. ํ•˜์ง€๋งŒ ํƒˆ์ทจ์˜ ์œ„ํ—˜๊ณผ ํ˜น์—ฌ๋‚˜ ํ† ํฐ ๋‚ด์šฉ์„ ํ’€์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๋‹ค๋Š” ์œ„ํ—˜ ๋•Œ๋ฌธ์— ์ตœ์†Œํ•œ์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋งŒ ๋‹ด๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค. ํ•„์ž์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ด๋ฉ”์ผ ์ •๋ณด๋งŒ ํ† ํฐ์— ๋‹ด์•˜๋‹ค.

ํ† ํฐ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์˜ ๋‹จ์ ์€ ํ† ํฐ์ด ํƒˆ์ทจ๋  ๊ฒฝ์šฐ์— ์„œ๋ฒ„์—์„œ ์ด๋ฅผ ์‹๋ณ„ํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ •์ƒ ์œ ์ € A ์™€ ๊ทธ์˜ ํ† ํฐ(T1)์„ ํƒˆ์ทจํ•œ ํ•ด์ปค H๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž.

์ •์ƒ์œ ์ €๋Š” Access Token์„ ์‚ฌ์šฉํ•ด ์„œ๋ฒ„ ์ธ์ฆ์„ ๊ฑฐ์ณ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํ† ํฐ์˜ stateless ํ•œ ํŠน์ง•์œผ๋กœ ์„œ๋ฒ„์—์„  ํ† ํฐ์„ ์ธ์ฆํ•  ๋•Œ ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ํ† ํฐ์„ ๋ณด๋ƒˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด A ์‚ฌ์šฉ์ž๊ฐ€ B ์‚ฌ์šฉ์ž์˜ ํ† ํฐ์„ ์ž์‹ ์˜ ํ—ค๋”์— ๋„ฃ๊ณ  ์„œ๋ฒ„์— ๋˜์ ธ๋„, ์„œ๋ฒ„ ์ธก์—์„  ๋ญ๊ฐ€ ์ž˜๋ชป๋๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

ํ•ด์ปค H๊ฐ€ ํƒˆ์ทจํ•œ ํ† ํฐ์„ ์„œ๋ฒ„์— ๋ณด๋‚ด๋„, ์„œ๋ฒ„๋Š” ๋˜‘๊ฐ™์ด ์ธ์ฆ์„ ํ•ด์ค€๋‹ค.

๊ทธ๋Ÿผ ์ด Access Token(T1) ์„ ํ•ด์ปค H ๊ฐ€ ํƒˆ์ทจํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. H๊ฐ€ T1์„ ์ž์‹ ์˜ Header์— ๋‹ด์•„ ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๋„, ์„œ๋ฒ„๋Š” A๊ฐ€ ์•„๋‹Œ H์˜ ์š”์ฒญ์ด๋ž€ ๊ฑธ ์•Œ ๊ธธ์ด ์—†๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋กœ ์ธํ•ด Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•œ๋‹ค. ํ† ํฐ์ด ํƒˆ์ทจ๋ผ๋„ ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง๊ธฐ ๋•Œ๋ฌธ์— ๊ธˆ๋ฐฉ ๋งŒ๋ฃŒ๋˜์–ด ๋”์ด์ƒ ์„œ๋ฒ„์— ์ธ์ฆ์„ ํ•  ์ˆ˜ ์—†๋‹ค.

๊ทธ๋Ÿผ ์ •์ƒ ์œ ์ € A ๋Š” ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ?

Access Token ์ด ๋งŒ๋ฃŒ๋  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๊ฑฐ์ณ Access Token ์„ ์žฌ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์งง์•„์ง„ Access Token ์œ ํšจ๊ธฐ๊ฐ„์œผ๋กœ ์ธํ•ด ๋งค๋ฒˆ ๋กœ๊ทธ์ธ์„ ํ•ด์•ผ ํ•˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์ข‹์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ค„ ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Refresh Token์ด ๋“ฑ์žฅํ•œ๋‹ค.

 

 

Refresh Token ์˜ ๋“ฑ์žฅ

Refresh Token์€ Access Token ๋งŒ๋ฃŒ ์‹œ ์žฌ๋ฐœ๊ธ‰ ๊ณผ์ •์— ์‚ฌ์šฉ๋œ๋‹ค. Refresh Token ์€ Access Token์˜ ์žฌ๋ฐœ๊ธ‰์— ์‚ฌ์šฉ๋˜์–ด ์‚ฌ์šฉ์ž๊ฐ€ ๋งค๋ฒˆ ๋กœ๊ทธ์ธ ๊ณผ์ •์„ ๊ฑฐ์น˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค. ์ •๋ฆฌํ•˜๋ฉด Access Token ์€ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์•„ ์ธ์ฆ๊ณผ์ •์— ์‚ฌ์šฉ๋˜๊ณ , Refresh Token ์€ ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง์•„์ง„ Access Token์˜ ์žฌ๋ฐœ๊ธ‰์— ์‚ฌ์šฉ๋ผ ์žฆ์€ ๋กœ๊ทธ์•„์›ƒ ๊ณผ์ •์„ ํ”ผํ•˜๊ฒŒ ํ•ด ์ค€๋‹ค.

์•ž์„œ Access Token์„ ์„ค๋ช…ํ•  ๋•Œ Access Token ์€ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ๋‹ด๋Š”๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ, Refresh Token์€ ์‚ฌ์šฉ์ž ๊ฐœ์ธ ์ •๋ณด์™€๋Š” ๊ด€๊ณ„์—†๋Š” ์‹๋ณ„์ž์šฉ UUID๋ฅผ ๋‹ด์•„๋„ ๋˜๊ณ , Access Token์ฒ˜๋Ÿผ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์•„๋„ ๋œ๋‹ค.

 

 

์œ ํšจ๊ธฐ๊ฐ„

refresh Token ์€ access token ์ด ๋งŒ๋ฃŒ๋์„ ๋•Œ ์žฌ๋ฐœ๊ธ‰์„ ๋„์™€์ค˜์•ผ ํ•˜๊ธฐ์—, access token ๋ณด๋‹ค ๊ธด ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ฐ–๋Š”๋‹ค. ํ•„์ž๋Š” Access Token์€ 2์‹œ๊ฐ„, Refresh Token์€ 2์ฃผ์˜ ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ฐ–๋„๋ก ์„ค์ •ํ–ˆ๋‹ค.

Refresh Token ์€ ์–ด๋–ป๊ฒŒ Access Token์˜ ์žฌ๋ฐœ๊ธ‰์„ ๋„์™€์ฃผ๋Š” ๊ฑธ๊นŒ?

 

์ด์ œ Access Token(์ดํ•˜ AT) ์ด ๋งŒ๋ฃŒ๋์„ ๋•Œ Refresh Token(RT) ์ด ์–ด๋–ป๊ฒŒ AT๋ฅผ ์žฌ๋ฐœ๊ธ‰ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด์ž.

์šฐ์„  AT๋Š” ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค. AT๋ฅผ ์žฌ๋ฐœ๊ธ‰ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์–ด๋–ค ํ† ํฐ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค๋Š” ๋œป์œผ๋กœ, ์ฆ‰ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์ค€๋น„๋ผ์•ผ ํ•œ๋‹ค. RT๋Š” ์„œ๋ฒ„์— ์ „์†ก๋˜์–ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ฌ key ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ์‚ฌ์šฉ์ž ์ €์žฅ์†Œ(RDB or Redis)์—์„œ RT๋กœ ์กฐํšŒํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊บผ๋‚ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ ํ›„ ๊ฐ€์ ธ์˜จ ์ •๋ณด๋ฅผ ๋งค๊ฐœ๋กœ AT๋ฅผ ์žฌ๋ฐœ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ๊นŒ์ง€๋Š” ๋ˆ„๊ตฌ๋‚˜ ์•„๋Š” ์ด์•ผ๊ธฐ๋‹ค.

 

Access Token ๋งŒ๋ฃŒ๋œ ๊ฒฝ์šฐ, Refresh Token์œผ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€ Access Token ์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

์œ„์—์„œ AT๊ฐ€ ํƒˆ์ทจ๋œ ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ์„ค์ •ํ•œ๋‹ค๊ณ  ๋ฐํ˜”๋‹ค.

๊ทธ๋Ÿผ A-T์™€ R-T๊ฐ€ ๋ชจ๋‘ ํƒˆ์ทจ๋œ ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด ๋ณด์ž. RT๋Š” AT ์žฌ๋ฐœ๊ธ‰ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ํšจ๊ธฐ๊ฐ„๋„ ๊ธธ์–ด์„œ, ํ•œ๋ฒˆ ํƒˆ์ทจ๋˜๋ฉด ๋งŒ๋ฃŒ ์‹œ๊นŒ์ง€ ํ•ด์ปค๊ฐ€ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ์˜ stateless ํŠน์ง• ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋Š” ํ† ํฐ์ด ํƒˆ์ทจ๋œ ์ง€๋„ ๋ชจ๋ฅธ ์ฑ„ ๊ณ„์† ์ธ์ฆ์„ ํ—ˆ๊ฐ€ํ•ด ์ค€๋‹ค.

 

 

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Refresh Token Rotation ๊ธฐ๋ฒ•์„ ๋„์ž…ํ–ˆ๋‹ค.

 

Refresh Token Rotation ๋„์ž…

 ๊ธฐ์กด์—๋Š” RT๋ฅผ ์ด์šฉํ•ด AT๋งŒ ์žฌ๋ฐœ๊ธ‰ํ–ˆ์ง€๋งŒ, Refresh Token Rotation ์€ AT ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ RT ๋„ ๊ฐ™์ด ์žฌ๋ฐœ๊ธ‰ํ•œ๋‹ค. ์„œ๋ฒ„ ์ธก์—์„  RT๋ฅผ ์žฌ๋ฐœ๊ธ‰ ์‹œ Redis๋‚˜ RDB์— ์ €์žฅ๋œ Refresh Token๋„ Update ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, RT๊ฐ€ ํƒˆ์ทจ๋๋‹ค ํ•˜๋”๋ผ๋„ ์„œ๋ฒ„ ์ธก์—์„œ ์ด๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ๊ณผ์—ฐ ์ด๊ฑธ๋กœ ๋์ผ๊นŒ?

 

์ด ๋ฌธ์ œ์˜ ํ•จ์ •์€ ํ† ํฐ ํƒˆ์ทจ๋ฒ”์ด ์ •์ƒ ์œ ์ €๋ณด๋‹ค ๋จผ์ € Refresh token์„ Rotation ํ•  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

๊ธฐ์กด์˜ AT์™€ RT๋Š” ์ƒˆ๋กœ์šด ํ† ํฐ์œผ๋กœ ๊ฐฑ์‹ ๋˜๊ณ , ์ €์žฅ์†Œ์—” ํ•ด์ปค๊ฐ€ ์žฌ๋ฐœ๊ธ‰๋ฐ›์€ Refresh Token์ด ์ €์žฅ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ •์ƒ์œ ์ €๊ฐ€ AT๋ฅผ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์œผ๋ ค ํ•ด๋„ (์ •์ƒ์ด์—ˆ๋˜)Refresh Token์ด Redis์— ์กด์žฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์žฌ๋ฐœ๊ธ‰์„ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค. ์„ ์ˆ˜๋ฅผ ๋บ๊ธธ ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

์ฆ‰ Refresh token Rotation ๊ธฐ๋ฒ•์€ ํ† ํฐ ํƒˆ์ทจ๋ฒ”์ด ์„ ์ˆ˜๋ฅผ ์น  ๋•Œ ์ƒํ™ฉ์ด ๊ผฌ์—ฌ๋ฒ„๋ฆฐ๋‹ค.

 

 

 

Redis ์ €์žฅ ๋ฐฉ์‹ ๋ณ€๊ฒฝ

Refresh Token์€ ๋‹จ์ˆœ ํ† ํฐ์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์€ JWT ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ–ˆ๊ณ  ์ด๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด Redis ์ €์žฅ์†Œ๋ฅผ ์„ ํƒํ–ˆ๋‹ค.

๋ณดํ†ต์€ Redis key๋กœ Refresh Token์„ ์‚ฌ์šฉํ•ด value์ธ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ €์žฅ, ์กฐํšŒํ•œ๋‹ค. Access Token์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์•„์•ผ ํ•  ๋•Œ, Refresh Token ์œผ๋กœ Redis ์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋กœ Access Token์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ํ”„๋กœ์„ธ์Šค๋‹ค.

ํ•„์ž๋Š” ์ด ๊ตฌ์กฐ๋ฅผ ์—ญ์œผ๋กœ ๋ฐ”๊ฟ”, "key : value = userPk : refresh token" ํ˜•ํƒœ๋กœ ์ €์žฅํ–ˆ๋‹ค.

์—ฅ ๋ฐ˜๋Œ€๋กœ ํ•˜๋Š”๊ฒŒ ๋งž์ง€ ์•Š๋ƒ๊ณ  ๋ฐ˜๋ฌธํ•  ์ˆ˜ ์žˆ๋‹ค. ์‚ฌ์‹ค ํ•„์ž๋„ ์ฒ˜์Œ์—” "key:value = refresh token: userPk" ํ˜•ํƒœ๋กœ ์ €์žฅํ–ˆ๋Š”๋ฐ, ๊ฒฐ๊ตญ์€ ๋ฐ˜๋Œ€๋กœ ์ €์žฅํ•œ ์ด์œ ๊ฐ€ ์žˆ๋‹ค.

 

์šฐ์„  ์ •์ƒ ์œ ์ €์˜ ์œ ์ฆˆ์ผ€์ด์Šค

์ •์ƒ ์œ ์ €๋Š” ์ตœ์ดˆ ๋กœ๊ทธ์ธ ์‹œ AT ์™€ RT๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ณ , Redis ์—” {userEmail : RT} ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

AT๊ฐ€ ๋งŒ๋ฃŒ๋˜๋ฉด Refresh Token Rotation ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ RT์™€ AT๋ฅผ ๋ชจ๋‘ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š”๋‹ค.

 

์ด ๊ณผ์ •์„ ์ƒ์„ธํžˆ ๋ณด๋ฉด,

์•ž์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด์•„ Refresh Token์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ๋ฐํ˜”๋‹ค. Refresh Token ์—์„œ User์˜ ์ •๋ณด(email)์„ ๊บผ๋‚ธ๋‹ค.

user email ์„ key ๋กœ Redis๋ฅผ ์กฐํšŒํ•œ๋‹ค. ์ •์ƒ์ ์œผ๋กœ ์กฐํšŒ๋˜๋ฉด ํ•ด๋‹น user ์˜ refresh token(value)๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

Redis์—์„œ ์กฐํšŒํ•œ refresh token๊ณผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ refresh Token์„ ๋น„๊ตํ•œ๋‹ค.

๋‘ ํ† ํฐ ๊ฐ’์ด ๋งค์นญ๋˜๋ฉด ์ •์ƒ ์œ ์ €๋กœ ๊ฐ„์ฃผํ•˜๊ณ , access token ๊ณผ refresh token์„ ๋ชจ๋‘ ์žฌ๋ฐœ๊ธ‰ ํ•œ๋‹ค. (AT -> AT`, RT -> RT`)

Redis์— ์ €์žฅ๋œ user email์˜ ๋งคํ•‘ ๊ฐ’์„ ๊ฐฑ์‹ ํ•œ๋‹ค. {user email : RT => RT`}

 

 

๋ญ์—ฌ ๋ณ„๋กœ ๋‹ค๋ฅผ๊ฒŒ ์—†๋Š”๋ฐ์š” ์„ ์ƒ๋‹˜?

 

์ž์ž ์ด์ œ ํ† ํฐ ํƒˆ์ทจ๋ฒ”์ด RT, AT๋ฅผ ๋ชจ๋‘ ํƒˆ์ทจํ•˜๊ณ  ์žฌ๋ฐœ๊ธ‰ ๊ณผ์ •๋„ ์„ ์ˆ˜์ณค๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž.

์ฆ‰ ์œ„์˜ 1,2,3,4,5 ๊ณผ์ •์„ ํ† ํฐ ํƒˆ์ทจ๋ฒ”์ด ๋จผ์ € ์ง„ํ–‰ํ•œ ์ดํ›„, ์ •์ƒ ์œ ์ € A๊ฐ€ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ๊ณผ์ •์„ ์‚ดํŽด๋ณด์ž.

 

1. ์ •์ƒ์œ ์ €์˜ RT์—์„œ user ์ด๋ฉ”์ผ์„ ๊บผ๋‚ธ๋‹ค.

2. user Email์„ key๋กœ Redis๋ฅผ ์กฐํšŒํ•˜๋ฉด ์ด์— ๋Œ€์‘๋˜๋Š” RT`๊ฐ€ ๋ฆฌํ„ด๋œ๋‹ค.

3. Redis์—์„œ ์กฐํšŒ๋œ RT`๋Š” ํ•ด์ปค์— ์˜ํ•ด ๋จผ์ € ์žฌ๋ฐœ๊ธ‰๋œ Refresh Token์œผ๋กœ, ์ฆ‰ ์ •์ƒ ์œ ์ €์˜ Refresh Token๊ณผ ์ƒ์ดํ•œ ๊ฐ’์ด๋‹ค. ์ฆ‰ ๋งค์นญ๋˜์ง€ ์•Š๋Š”๋‹ค.

4. RT๊ฐ„ ๋งค์นญ์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„๋Š” ํ•ด๋‹น ์œ ์ €์— ๋Œ€ํ•œ ์•…์˜์ ์ธ ์นจํˆฌ๋ฅผ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

5. Redis์—์„œ ํ•ด๋‹น ์œ ์ € ์ด๋ฉ”์ผ key ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์žฌ๋กœ๊ทธ์ธ ํ•˜๋„๋ก ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

 

์ด์ „๊นŒ์ง€์˜ ๋ฐฉ๋ฒ•๊ณผ ๋‹ค๋ฅธ์ ์€ Redis์— ์ €์žฅ๋œ ํ‚ค๋ฅผ RT๊ฐ€ ์•„๋‹Œ userPK(email) ๋กœ ํ–ˆ๋‹ค๋Š” ์ ์ด๋‹ค.

์ด์™€ ๋‹ฌ๋ฆฌ RT๋ฅผ ํ‚ค๋กœ ์‚ผ์„ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. ์‚ฌ์šฉ์ž์™€ ํ•ด์ปค ๋ชจ๋‘ RT ์žฌ๋ฐœ๊ธ‰์„ ๋ฐ›์œผ๋ฉด Redis ๋Š” ํ•œ ๋ช…์˜ ์œ ์ € ์ •๋ณด์— ๋Œ€ํ•ด ๋‹ค์ˆ˜์˜ key ๋ฅผ ๊ฐ€์ง€๋ฉฐ ์–ด๋–ค key(refresh token)๊ฐ€ ์ •์ƒ์œ ์ €์˜ ๊ฒƒ์ธ์ง€ ๋ถ„๊ฐ„ํ•  ์ˆ˜ ์—†๋‹ค. ์„ค์ƒ๊ฐ€์ƒ์œผ๋กœ ๋‘˜ ์ด์ƒ์˜ ํƒˆ์ทจ๋ฒ”์—๊ฒŒ ํ† ํฐ์ด ํ„ธ๋ฆฌ๋ฉด, Redis์—” ํ•œ๋ช…์œผ๋กœ ๋ถ€ํ„ฐ ๋ฐœ๊ธ‰๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ RT๊ฐ€ ์ €์žฅ๋œ๋‹ค.

 

III. ๊ฒฐ๋ก 

์ •๋ฆฌ

์ฒ˜์Œ์— ์„ค์ •ํ•œ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ์ •๋ฆฌํ•ด๋ณด์ž.

 

1. ์œ ํšจ๊ธฐ๊ฐ„์ด ๊ธด Refresh Token์ด ํƒˆ์ทจ๋œ ๊ฒฝ์šฐ

2. ํƒˆ์ทจํ•œ Refresh Token์œผ๋กœ ์ •์ƒ ์œ ์ €๋ณด๋‹ค ๋จผ์ € Access Token์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›๋Š” ๊ฒฝ์šฐ

3. (ํ† ํฐ ํƒˆ์ทจ๋œ ๊ฒฝ์šฐ) ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž์— ์—ฌ๋Ÿฌ refresh token ๊ฐ’์ด ์ €์žฅ๋˜๋Š” ๊ฒฝ์šฐ

1) Refresh token rotation(RTR) ์„ ์‚ฌ์šฉํ•ด 1๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. RT๊ฐ€ ํƒˆ์ทจ๋˜๋”๋ผ๋„ AT๋ฅผ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค RT๋ฅผ ๊ฐฑ์‹ ํ•ด ๊ธฐ์กด RT๋ฅผ ๋ฌดํšจํ™” ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

2) 3) ํ•˜์ง€๋งŒ RTR ๋งŒ์œผ๋กœ๋Š” 2๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค. ํƒˆ์ทจ๋ฒ”์ด AT๋ฅผ ๋จผ์ € ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์•„๋ฒ„๋ฆฌ๋ฉด, ์˜คํžˆ๋ ค ์ •์ƒ ์œ ์ €์˜ RT๊ฐ€ ๋ฌดํšจํ™” ๋˜๋Š” ๊ผด์ด ๋œ๋‹ค. ์ •์ƒ ์œ ์ €์•ผ ๋‹ค์‹œ ๋กœ๊ทธ์ธํ•ด์„œ refresh token์„ ๋ฐœ๊ธ‰๋ฐ›์œผ๋ฉด ๋˜์ง€๋งŒ, ํ•ด์ปค๋Š” ๊ธฐ์กด์— ํƒˆ์ทจํ•œ refresh token ์„ ์ง€์†์ ์œผ๋กœ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์กด์žฌํ•œ๋‹ค. ๋˜ํ•œ ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํ•œ ๋ช…์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ์—ฌ๋Ÿฌ๊ฐœ์˜ refresh token ์ด ์ƒ์„ฑ๋˜๋Š” ๊ผด์ด๋‹ค.

 

์œ„ 2) 3) ๋ฌธ์ œ๋Š” Redis์— ์ €์žฅ๋  key๋ฅผ refresh token ์ด ์•„๋‹Œ userPk๋กœ ์„ค์ •ํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. Redis ์„œ๋ฒ„๋Š” ํ•œ๋ช…์˜ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ํ•˜๋‚˜์˜ ํ† ํฐ๋งŒ ์กด์žฌํ•จ์„ ๊ฑธ ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ์–ด ํ† ํฐ์ด ํƒˆ์ทจ๋œ ๊ฒฝ์šฐ ์ด๋ฅผ ์ธ์ง€ํ•˜๊ณ  ๋Œ€์ฒ˜(๋กœ๊ทธ์•„์›ƒ ์ฒ˜๋ฆฌ ๋“ฑ)ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ

์•ž์„œ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ธ์…˜ ๊ธฐ๋ฐ˜ ์ธ์ฆ์— ๋Œ€ํ•ด ์–˜๊ธฐํ–ˆ๋‹ค. ์„œ๋ฒ„ ๋ฉ”๋ชจ๋ฆฌ์— ์„ธ์…˜ ์ €์žฅ์†Œ๋ฅผ ๋‘๊ณ  ์‚ฌ์šฉ์ž๋ฅผ ์ธ์ฆํ•˜๋Š” ๋ฐฉ์‹์ธ๋ฐ, Redis์— ์‚ฌ์šฉ์ž ์ •๋ณด์™€ refresh token์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์„ธ์…˜๊ธฐ๋ฐ˜ ๋ฐฉ์‹๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค. ์ปจ์…‰์€ ๋น„์Šทํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ฒฐ์ •์ ์œผ๋กœ redis๋ฅผ ์‚ฌ์šฉํ•œ ํ† ํฐ ์ธ์ฆ๋ฐฉ์‹์€ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค๊ณ  ํ•ด์„œ (๋ฉ”์ธ)์„œ๋ฒ„ ๋ถ€ํ•˜๊ฐ€ ๋Š˜์ง€ ์•Š๊ณ , ์„œ๋ฒ„ ํ™•์žฅ์„ฑ ๋ฌธ์ œ๋กœ๋ถ€ํ„ฐ๋„ ์ž์œ ๋กญ๋‹ค. ๋ฌผ๋ก  redis์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ์„ค์ •ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ง์ด๋‹ค.

 

๋˜ Refresh Token ์ด ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค๋Š” ์ ์—์„œ accesss token ๋Œ€์‹  refresh token ์„ ๋ณด๋‚ด๋ฉด ๋˜๋Š” ๊ฒƒ ์•„๋‹ˆ๋ƒ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ์œ ํšจ๊ธฐ๊ฐ„์ด ์งง์€ access token ๋Œ€์‹  ์œ ํšจ๊ธฐ๊ฐ„์ด ๊ธด refresh token์„ ๋ณด๋‚ด๋ฉด ์žฌ๋ฐœ๊ธ‰ ๊ณผ์ •๋„ ํ•„์š”์—†๊ฒ ๋‹ค ๋ณด์•ˆ์ด ์ˆญ์ˆญ ๋šซ๋ฆฌ์ง€ ์•Š๊ฒ ๋ƒ๋Š” ์˜๊ฒฌ์ด์—ˆ๋Š”๋ฐ, ๋‹คํ–‰ํžˆ ๊ฐ๊ฐ์˜ ํ† ํฐ์„ ์ƒ์„ฑํ•˜๋Š” secret key ๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— refresh token์„ access token ๋Œ€์‹  ๋ณด๋‚ธ๋‹ค๊ณ  ํ•ด์„œ ํ•ด๋‹น ํ† ํฐ์ด resolve ๋  ์ผ์€ ์—†๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•๋„ ์€ํƒ„ํ™˜์€ ๋  ์ˆ˜ ์—†๋‹ค.

 

๋งŒ์•ฝ ์ •์ƒ ์œ ์ € A๊ฐ€ ์„œ๋น„์Šค์— ์˜ค๋žซ๋™์•ˆ ์ ‘์†ํ•˜์ง€ ์•Š์€ ์ƒํ™ฉ์—์„œ R-T๊ฐ€ ํƒˆ์ทจ๋๋‹ค๊ณ  ํ•˜์ž. ์„œ๋ฒ„๋Š” ํ•ด์ปค์˜ R-T๋งŒ ์ง€์†์ ์œผ๋กœ ์žฌ๋ฐœ๊ธ‰ํ•˜๊ณ  Redis์—์„  R-T๋น„๊ต ๊ณผ์ •์—์„œ ์˜ˆ์™ธ๋ฅผ ๋˜์งˆ ์ผ ๋„ ์—†์–ด์ง„๋‹ค. ๊ทผ๋ฐ ์ด๊ฑด RTR์˜ ๋ฌธ์ œ๋ผ๊ธฐ ๋ณด๋‹ค ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ๋ฐฉ์‹์ด ๊ฐ€์ง€๋Š” ํ•„์—ฐ์ ์ธ ๋ฌธ์ œ์ผ ์ˆ˜ ๋ฐ–์— ์—†๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

 

๊ฒฐ๊ตญ ์€ํƒ„ํ™˜์€ ์—†๋‹ค๋Š” ์ฐœ์ฐœํ•œ ๊ฒฐ๋ก ๋งŒ ๋‚ด๊ฒŒ ๋๋‹ค. ์ด ๋ชจ๋“  ๋ฌธ์ œ๋Š” ํ† ํฐ์„ ํƒˆ์ทจ ๋‹นํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋Š์ •๋„ ํ•ด๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์ด์–ธํŠธ ์ชฝ์—์„œ๋„ ํ•„์š”ํ•œ ์ค€๋น„๋ฅผ ํ•˜๋Š” ์‹์œผ๋กœ ๊ฐ™์ด ์ค€๋น„๋ฅผ ํ•ด์•ผํ•œ๋‹ค.


ํ”ผ๋“œ๋ฐฑ ํ™˜์˜๐Ÿ’˜