๐Ÿง Access Token๊ณผ Refresh Token์ด๋ž€ ๋ฌด์—‡์ด๊ณ  ์™œ ํ•„์š”ํ• ๊นŒ?

๊น€๋ฏผ์ฃผยท2023๋…„ 8์›” 11์ผ
24

๋“ค์–ด๊ฐ€๊ธฐ

JWT ํ† ํฐ์€ ์œ ์ €์˜ ์‹ ์›์ด๋‚˜ ๊ถŒํ•œ์„ ๊ฒฐ์ •ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์กฐ๊ฐ์ด๋‹ค. JWT ํ† ํฐ์„ ์‚ฌ์šฉํ•ด์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ํ†ต์‹ ํ•˜๋‹ค. ์™œ๋ƒํ•˜๋ฉด JWT ํ† ํฐ ์ธ์ฆ๋ฐฉ์‹์€ ๋น„๋ฐ€ํ‚ค(๊ฐœ์ธํ‚ค or ๋Œ€์นญํ‚ค)๋กœ ์•”ํ˜ธํ™”๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํƒˆ์ทจ ๋‹นํ–ˆ์„ ๋•Œ๊ฐ€ ๋ฌธ์ œ๋‹ค.๐Ÿ™€ JWT ํ† ํฐ์„ ํƒˆ์ทจํ•œ ์‚ฌ๋žŒ์€ ๋งˆ์น˜ ์‹ ๋ขฐํ• ๋งŒํ•œ ์‚ฌ๋žŒ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ธ์ฆ์„ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์‹ฌ์ง€์–ด ๋ณธ ์ฃผ์ธ์ธ ํด๋ผ์ด์–ธํŠธ์™€ ํƒˆ์ทจํ•œ ์‚ฌ๋žŒ์„ ์„œ๋ฒ„๋Š” ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ์œ ํšจ ๊ธฐ๊ฐ„์„ ๋‘์–ด์•ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์œ ํšจ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ๋‘๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธ์„ ์ž์ฃผ ํ•ด์•ผํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ ์œผ๋กœ ์ข‹์ง€ ์•Š๊ณ , ์œ ํšจ๊ธฐ๊ฐ„์„ ๊ธธ๊ฒŒ ๋‘๋ฉด ๋ณด์•ˆ์ƒ ํƒˆ์ทจ ์œ„ํ—˜์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋‹ค.

ํ•ด๊ฒฐ๋ฒ•์€ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋‹ค๋ฅธ JWT ํ† ํฐ 2๊ฐœ(Acses Token๊ณผ Refresh Token)์„ ๋‘๋Š” ๊ฒƒ์ด๋‹ค.

ํ”„๋กœ์„ธ์Šค

๊ธฐ๋ณธ์ ์ธ ๊ฐœ๋…์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

์ฆ‰, ํ†ต์‹ ๊ณผ์ •์—์„œ ํƒˆ์ทจ๋‹นํ•  ์œ„ํ—˜์ด ํฐ Access Token์˜ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์„ ์งง๊ฒŒ ๋‘๊ณ  Refresh Token์œผ๋กœ ์ฃผ๊ธฐ์ ์œผ๋กœ ์žฌ๋ฐœ๊ธ‰ํ•จ์œผ๋กœ์จ ํ”ผํ•ด์„ ์ตœ์†Œํ™”ํ•œ ๊ฒƒ์ด๋‹ค.

๐Ÿง‘โ€๐Ÿซย ๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ธฐ (์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ํ†ต์‹ )

  1. ๋กœ๊ทธ์ธ ์ธ์ฆ์— ์„ฑ๊ณตํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” Refresh Token๊ณผ Access Token ๋‘ ๊ฐœ๋ฅผ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›๋Š”๋‹ค.
  2. ํด๋ผ์ด์–ธํŠธ๋Š” Refresh Token๊ณผ Access Token์„ ๋กœ์ปฌ์— ์ €์žฅํ•ด๋†“๋Š”๋‹ค.
  3. ํด๋ผ์ด์–ธํŠธ๋Š” ํ—ค๋”์— Access Token์„ ๋„ฃ๊ณ  API ํ†ต์‹ ์„ ํ•œ๋‹ค. (Authorization)
  4. ์ผ์ • ๊ธฐ๊ฐ„์ด ์ง€๋‚˜ Access Token์˜ ์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค.
    4.1. Access Token์€ ์ด์ œ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ถŒํ•œ์ด ์—†๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋œ๋‹ค.
    4.2. ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ์œ ํšจ๊ธฐ๊ฐ„์ด ์ง€๋‚œ Access Token์„ ๋ฐ›์€ ์„œ๋ฒ„๋Š” 401 (Unauthorized) ์—๋Ÿฌ ์ฝ”๋“œ๋กœ ์‘๋‹ตํ•œ๋‹ค.
    4.3. 401๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” invalid_token (์œ ํšจ๊ธฐ๊ฐ„์ด ๋งŒ๋ฃŒ๋˜์—ˆ์Œ)์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
  5. ํ—ค๋”์— Access Token ๋Œ€์‹  Refresh Token์„ ๋„ฃ์–ด API๋ฅผ ์žฌ์š”์ฒญํ•œ๋‹ค.
  6. Refresh Token์œผ๋กœ ์‚ฌ์šฉ์ž์˜ ๊ถŒํ•œ์„ ํ™•์ธํ•œ ์„œ๋ฒ„๋Š” ์‘๋‹ต์ฟผ๋ฆฌ ํ—ค๋”์— ์ƒˆ๋กœ์šด Access Token์„ ๋„ฃ์–ด ์‘๋‹ตํ•œ๋‹ค.
  7. ๋งŒ์•ฝ Refresh Token๋„ ๋งŒ๋ฃŒ๋˜์—ˆ๋‹ค๋ฉด ์„œ๋ฒ„๋Š” ๋™์ผํ•˜๊ฒŒ 401 error code๋ฅผ ๋ณด๋‚ด๊ณ , ํด๋ผ์ด์–ธํŠธ๋Š” ์žฌ๋กœ๊ทธ์ธํ•ด์•ผํ•œ๋‹ค.

์•…์˜์žˆ๋Š” ํƒˆ์ทจ์ž๋Š” ํ†ต์‹ ์ด ๋นˆ๋ฒˆํ•œ Access Token์„ ํƒˆ์ทจํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ์šด์ด ์ข‹๊ฒŒ ํƒˆ์ทจ์— ์„ฑ๊ณตํ–ˆ๋”๋ผ๋„ Access Token์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์€ ์งง๊ธฐ ๋•Œ๋ฌธ์— ํƒˆ์ทจ์ž๋Š” ๋˜ ๋‹ค์‹œ ํƒˆ์ทจ๋ฅผ ์‹œ๋„ํ•ด์•ผํ•œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด JWT Token์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์€ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค!

JWT ํ† ํฐ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ์ƒ๊ฐํ•ด๋ณด๋ฉด Header, Payload, Signature๋กœ ๋˜์–ด์žˆ๋‹ค. ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์€ Payload์— ์ ํ˜€์žˆ๊ณ , Signature๋Š” Header+Payload๋ฅผ ๋น„๋ฐ€ํ‚ค๋กœ ์•”ํ˜ธํ™”ํ•œ ๊ฒƒ์ด๋‹ค. ํƒˆ์ทจ์ž๋Š” ํ† ํฐ์€ ๊ณ„์† ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๊ธฐ ๋•Œ๋ฌธ์— Payload์— ์žˆ๋Š” ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์„ ๋Š˜๋ฆฌ๋ ค๊ณ  ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Payload์˜ ๋งŒ๋ฃŒ๊ธฐ๊ฐ„์„ ๋ฐ”๊พผ๋‹ค๊ณ  ํ•ด์„œ Signature๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. Signature์—์„œ ๋ณตํ˜ธํ™”ํ•œ Payload์™€ ๋ณ€๊ฒฝ๋œ Payload๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๋น„๋ฐ€ํ‚ค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์„œ๋ฒ„๋Š” ์•Œ ์ˆ˜ ์žˆ๊ณ , ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋‚ด์–ด์ฃผ์ง€ ์•Š๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Refresh Token ํƒˆ์ทจ ์œ„ํ—˜

Refresh Token์˜ ํ†ต์‹  ๋นˆ๋„๊ฐ€ ์ ๊ธฐ๋Š” ํ•˜์ง€๋งŒ ํƒˆ์ทจ ์œ„ํ—˜์—์„œ ์™„์ „ํžˆ ๋ฒ—์–ด๋‚œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. Refresh Token์ด ํƒˆ์ทจ๋‹นํ•˜๋Š” ๊ฑด ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ์„๊นŒ? OAuth์—์„œ๋Š” Refresh Token Rotation์„ ์ œ์‹œํ•œ๋‹ค.

Refresh Token Rotation์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ Access Token๋ฅผ ์žฌ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค Refresh Token๋„ ์ƒˆ๋กœ ๋ฐœ๊ธ‰๋ฐ›๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋˜๋ฉด ํƒˆ์ทจ์ž๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” Refresh Token์€ ๋”์ด์ƒ ๋งŒ๋ฃŒ ๊ธฐ๊ฐ„์ด ๊ธด ํ† ํฐ์ด ์•„๋‹ˆ๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถˆ๋ฒ•์ ์ธ ์‚ฌ์šฉ์˜ ์œ„ํ—˜์€ ์ค„์–ด๋“ ๋‹ค.

ํ˜น์‹œ ๋” ๊ถ๊ธˆํ•œ ์‚ฌ๋žŒ๋“ค์€ ์•„๋ž˜ ์˜์ƒ์„ ๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

What are Refresh Tokens?! and How to use them securely?

๊ฒฐ๋ก 

  • Refresh Token์€ JWT ํ† ํฐ์˜ ํƒˆ์ทจ ์œ„ํ—˜์„ ์ตœ์†Œํ™”ํ•˜๊ณ , ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋†’์ด๊ธฐ ์œ„ํ•ด(๋นˆ๋ฒˆํ•œ ์žฌ๋กœ๊ทธ์ธ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด) ๋‚˜์˜จ ๊ฒƒ์ด๋‹ค.
  • Access Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์€ ์งง๊ณ , ํ‰์†Œ API ํ†ต์‹ ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • Refresh Token์˜ ์œ ํšจ ๊ธฐ๊ฐ„์€ ๊ธธ๊ณ , Access Token ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  • Refresh Token์€ ์—ฌ์ „ํžˆ ํƒˆ์ทจ ์œ„ํ—˜์ด ์žˆ๊ณ , Refresh Token Rotation์„ ํ†ตํ•ด ์œ„ํ—˜์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

https://auth0.com/blog/refresh-tokens-what-are-they-and-when-to-use-them/

https://velog.io/@park2348190/JWT์—์„œ-Refresh-Token์€-์™œ-ํ•„์š”ํ•œ๊ฐ€

profile
์ฆ๊ฑฐ์šด ๊ฐœ๋ฐœ์ž ๊น€๋ฏผ์ฃผ์ž…๋‹ˆ๋‹ค๐Ÿ™‚

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

comment-user-thumbnail
2023๋…„ 8์›” 11์ผ

์ •๋ฆฌ๊ฐ€ ์ž˜ ๋œ ๊ธ€์ด๋„ค์š”. ๋„์›€์ด ๋์Šต๋‹ˆ๋‹ค.

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2024๋…„ 3์›” 25์ผ

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!! JWT ๋งŒ ์‚ฌ์šฉํ•ด์„œ ๋‹ค๋ฅธ ํ† ํฐ์€ ๊ฐœ๋…์ด ๋ชจํ˜ธํ–ˆ๋Š”๋ฐ ์ด ๊ธ€ ๋•๋ถ„์— ์ •ํ™•ํžˆ ์งš๊ณ  ๊ฐ‘๋‹ˆ๋‹ค ^^

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2024๋…„ 4์›” 20์ผ

์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2024๋…„ 5์›” 2์ผ

๊ตฌ์ฒด์ ์œผ๋กœ ์‚ดํŽด๋ณด๊ธฐ (์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ํ†ต์‹ )๋ฅผ ์ฝ๊ณ  ํ๋ฆ„์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ์ดํ•ดํ–ˆ์–ด์š”. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2024๋…„ 5์›” 11์ผ

๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. Refresh Token Rotation์„ ์จ์„œ ์•ก์„ธ์Šคํ† ํฐ ์žฌ์š”์ฒญ๋งˆ๋‹ค ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ํ•˜๋ฉด ๋ฆฌํ”„๋ž˜์‹œ ํ† ํฐ ์œ ํšจ๊ธฐ๊ฐ„ (์˜ˆ:1๋…„)์ด ์ดˆ๊ธฐํ™” ๋ ํ…๋ฐ ๊ทธ๋Ÿฌ๋ฉด ์œ ์ €๊ฐ€ 1๋…„์— ํ•œ ๋ฒˆ ์ด์ƒ ์‚ฌ์ดํŠธ๋ฅผ ์žฌ๋ฐฉ๋ฌธํ•˜๋ฉด ์ด๋ก ์ƒ ํ‰์ƒ๋™์•ˆ ํ† ํฐ์„ ์žฌ๋ฐœ๊ธ‰ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”๊ฑด๊ฐ€์š”?

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2024๋…„ 5์›” 14์ผ

์ดํ•ดํ•˜๋Š” ๋ฐ ์—„์ฒญ๋‚˜๊ฒŒ ๋„์›€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ