Json Web Token - g-market/b-shop-backend GitHub Wiki

JWT

λΉ„λ°€ν‚€λ₯Ό μ΄μš©ν•˜μ—¬ μ„œλͺ…λœ JSON ν˜•νƒœμ˜ λ°μ΄ν„°μž…λ‹ˆλ‹€. νŽ˜μ΄λ‘œλ“œμ— μ‚¬μš©μž 인증 정보λ₯Ό λ„£μ–΄μ„œ 토큰을 λ°œκΈ‰ν•΄μ£Όλ©΄ μΆ”ν›„ 인증이 ν•„μš”ν•œ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Ό μ‹œ μ‚¬μš©μžκ°€ μ„œλ²„μ— 토큰을 ν¬ν•¨ν•΄μ„œ μ „μ†‘ν•˜μ—¬ μ„œλ²„μΈ‘μ—μ„œλŠ” λ³΅μž‘ν•œ 인증 κ³Όμ • 없이 ν† ν°λ§ŒμœΌλ‘œ μ‚¬μš©μžλ₯Ό 인증 및 인가할 수 μžˆλŠ” κ²ƒμž…λ‹ˆλ‹€.

JWTλŠ” 헀더, νŽ˜μ΄λ‘œλ“œ, sign(μ„œλͺ…) μ„Έ κ°€μ§€ 정보λ₯Ό base64둜 μΈμ½”λ”©ν•œ 값을 콀마('.')λ₯Ό 사이에 두고 이어뢙인 ν˜•νƒœλ‘œ μƒμ„±λ©λ‹ˆλ‹€.

  • 헀더: JWT μ„œλͺ…에 μ‚¬μš©λœ μ•Œκ³ λ¦¬μ¦˜μ„ λ‹΄μλ‹ˆλ‹€.
  • νŽ˜μ΄λ‘œλ“œ: 토큰에 λ‹΄κΈ΄ 주체(Subject), 만료일(exp), μƒμ„±μž(issuer) 등을 λ‹΄μλ‹ˆλ‹€.
  • μ‹œκ·Έλ‹ˆμ²˜: 헀더와 νŽ˜μ΄λ‘œλ“œλ₯Ό 각각 base64둜 μΈμ½”λ”©ν•œ ν›„ 콀마둜 이어뢙인닀. 그리고 이λ₯Ό 헀더에 λͺ…μ‹œλœ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ μ•”ν˜Έν™”ν•œ 값을 λ‹΄μλ‹ˆλ‹€.

λΉ„λŒ€μΉ­ν‚€ μ•”ν˜Έν™” 방식을 μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— μ„œλ²„μΈ‘μ—μ„œλŠ” 이 토큰을 λ°›μ•„μ„œ μ‹œκ·Έλ‹ˆμ²˜λ₯Ό λ³΅ν˜Έν™”ν•˜μ—¬ λ””μ½”λ”©ν•˜λŠ” λ°©μ‹μœΌλ‘œ ν† ν°μ˜ μœ νš¨μ„±μ„ 검증할 수 μžˆμŠ΅λ‹ˆλ‹€.

Access Token, Refresh Token

μ„œλ²„μΈ‘ λ¦¬μ†ŒμŠ€μ— μ ‘κ·Όν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ 본인을 인증할 수 μžˆλŠ” μ•‘μ„ΈμŠ€ ν† ν°μœΌλ‘œ λ™μž‘ν•©λ‹ˆλ‹€. 그런데 이 JWTλŠ” Statelessν•œ 방식이기 λ•Œλ¬Έμ— μ„œλ²„μΈ‘μ—μ„œλŠ” 이 토큰을 κ°–κ³  μžˆλŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ 정말 ν΄λΌμ΄μ–ΈνŠΈ 본인이 λ§žλŠ”μ§€ 확인할 수 μ—†λ‹€λŠ” 문제점이 μžˆμŠ΅λ‹ˆλ‹€.

κ·Έλž˜μ„œ 이에 λŒ€ν•œ λ³΄μ•ˆ λŒ€μ±…μœΌλ‘œ λ¦¬ν”„λ ˆμ‰¬ ν† ν°μ΄λΌλŠ” 좔가적인 토큰을 ν™œμš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이 λ¦¬ν”„λ ˆμ‰¬ 토큰은 μ‚¬μš©μž 인증이 μ•„λ‹Œ μƒˆλ‘œμš΄ μ•‘μ„ΈμŠ€ 토큰을 μƒμ„±ν•˜λŠ” μš©λ„λ‘œλ§Œ μ‚¬μš©λ©λ‹ˆλ‹€.

그러면 μ™œ ꡳ이 λ³„λ„μ˜ 토큰을 두고 μƒˆλ‘œμš΄ μ•‘μ„ΈμŠ€ 토큰을 λ°œκΈ‰λ°›λ„λ‘ ν•œ κ²ƒμΌκΉŒμš”? μ΄λŠ” μœ„μ˜ JWT 유좜 문제λ₯Ό λ‹€μŒμ²˜λŸΌ ν•΄κ²°ν•˜κΈ° μœ„ν•œ κ²ƒμž…λ‹ˆλ‹€.

  • μ‚¬μš©μžλŠ” Access Tokenκ³Ό Refresh Token을 λ‘˜ λ‹€ μ„œλ²„μ— μ „μ†‘ν•˜μ—¬ μ „μžλ‘œ μΈμ¦ν•˜κ³  λ§Œλ£Œλμ„ μ‹œ ν›„μžλ‘œ μƒˆλ‘œμš΄ Access Token을 λ°œκΈ‰.
  • κ³΅κ²©μžλŠ” Access Token을 νƒˆμ·¨ν•˜λ”λΌλ„ 짧은 유효 기간이 μ§€λ‚˜λ©΄ μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • 정상적인 ν΄λΌμ΄μ–ΈνŠΈλŠ” 유효 기간이 μ§€λ‚˜λ”λΌλ„ Refresh Token을 μ‚¬μš©ν•˜μ—¬ μƒˆλ‘œμš΄ Access Token을 생성, μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½ Refresh Token의 νƒˆμ·¨κ°€ λ°œμƒν•œλ‹€λ©΄?

κ³΅κ²©μžλŠ” 이 ν† ν°μ˜ 유효 κΈ°κ°„λ§ŒνΌ λ‹€μ‹œ Access Token을 μƒμ„±ν•΄μ„œ λ‹€μ‹œ 정상적인 μ‚¬μš©μžμΈ μ²™ μœ„μž₯ν•  수 μžˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— μ—¬κΈ°μ„œλŠ” μ„œλ²„μΈ‘μ˜ 검증 둜직이 ν•„μš”ν•©λ‹ˆλ‹€.

ν•΄κ²° 방법: μ„œλ²„ NO_SQL REDIS μ—μ„œ Refresh Token을 μ‚­μ œ

Refresh_Token_α„α…‘α†―α„Žα…±
(https://user-images.githubusercontent.com/32899025/228708386-bef5f54c-1912-4dfa-9937-1c0801a56174.mp4)