πŸ‘¦ 내일배움캠프/TIL(Today I Learned)

TIL_220630_rest_framework_simplejwt

  • -

restframework-simplejwt

인증의 μ’…λ₯˜

1. μ„Έμ…˜ 인증 방식

λΈŒλΌμš°μ €μ—μ„œ μ‚¬μš©μžκ°€ μΈμ¦(Authentication)을 μˆ˜ν–‰ν•˜λ©΄ μ„œλ²„μ—μ„œ μ‚¬μš©μžμ˜ 정보λ₯Ό μ €μž₯.
μ‘λ‹΅μœΌλ‘œ μ„Έμ…˜(JSESSIONID) ν‚€λ₯Ό μ΄μš©ν•΄ ν΄λΌμ΄μ–ΈνŠΈ λΈŒλΌμš°μ €μ˜ μΏ ν‚€μ— μ„Έμ…˜(JSESSIONID)의 정보λ₯Ό μ €μž₯ν•˜κ²Œ 됨.
ν΄λΌμ΄μ–ΈνŠΈλŠ” λΈŒλΌμš°μ € 쿠킀에 μ €μž₯된 μ„Έμ…˜μœΌλ‘œ μ €μž₯된 μ„Έμ…˜μ •λ³΄λ₯Ό μ΄μš©ν•΄ μΈκ°€(Authrization)된 정보에 μ ‘κ·Ό ν—ˆμš©.

 

2. 토큰 인증 방식

토큰 인증 방식은 μ‚¬μš©μžκ°€ 인증을 μˆ˜ν–‰ν•˜λ©΄ μ„œλ²„μ—μ„œλŠ” 토큰을 μƒμ„±ν•œ 뒀에 μ €μž₯ν•˜μ§€ μ•Šκ³ (stateless) 토큰값을 μ‚¬μš©μžμ˜ λΈŒλΌμš°μ €μ—κ²Œ 응닡함.
토큰값을 μ‚¬μš©μžκ°€ μΈκ°€λœ μ‚¬μš©μžλ§Œ μ‚¬μš©ν•  수 μžˆλŠ” μ„œλΉ„μŠ€λ₯Ό μš”μ²­ν•  λ•Œ ν•¨κ»˜ λ³΄λ‚΄κ²Œ 되고, μ„œλ²„μ—μ„œ 이 토큰을 의미 μžˆλŠ” κ°’μœΌλ‘œ 해석 및 μΈμ¦ν•˜κ²Œ 됨.
토큰은 username, user_id λ“± μ‚¬μš©μžλ₯Ό μ„€λͺ…ν•  수 μžˆλŠ” 데이터λ₯Ό ν¬ν•¨ν•˜κ²Œ 됨.
μ°Έκ³  : μ‚¬μš©μžλ₯Ό μ„€λͺ…ν•  수 μžˆλŠ” 데이터λ₯Ό ν΄λ ˆμž„(claim) μ΄λΌκ³  함.

 

3. JWT(Json Web Token)

토큰 인증 λ°©μ‹μ˜ λŒ€ν‘œμ£Όμž.
JWT 토큰 κ΅¬μ‘°λŠ” {HEADER}.{PAYLOAD}.{VERIFY_SIGNATURE} λ‘œ 이루어져 있음.
JWT μ˜ˆμ‹œ : {eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9}.{eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ}.{SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c}
- μœ„μ™€ 같이 각 λ°μ΄ν„°λŠ” 온점으둜 ꡬ뢄.

 

4. HEADER

HEADER λŠ” JWT λ₯Ό κ²€μ¦ν•˜λŠ”λ° ν•„μš”ν•œ 정보λ₯Ό 가진 데이터
VERIFY_SIGNATURE 에 μ‚¬μš©ν•œ μ•”ν˜Έν™” μ•Œκ³ λ¦¬μ¦˜κ³Ό 토큰 νƒ€μž…, key 의 id λ“±μ˜ 정보λ₯Ό 가지고 있음.
μ•”ν˜Έν™”λœ 값은 μ•„λ‹˜.
HEADER μ •λ³΄
{
    "typ": "JWT",    # 토큰 νƒ€μž…
    "alg": "HS256"   # μ•Œκ³ λ¦¬μ¦˜
}

 

5. PAYLOAD

μ‹€μ§ˆμ μœΌλ‘œ 인증에 ν•„μš”ν•œ 데이터λ₯Ό μ €μž₯.
데이터 각각의 ν•„λ“œλ₯Ό ν΄λ ˆμž„(claim)이라고 ν•œλ‹€.
λŒ€λΆ€λΆ„μ˜ 경우 ν΄λ ˆμž„μ— username λ˜λŠ” user_id λ₯Ό 포함.
μΈμ¦μ‹œμ— payload μ— μžˆλŠ” username μ„ κ°€μ Έμ™€μ„œ μ‚¬μš©μžμ˜ 정보λ₯Ό 인증할 λ•Œ μ‚¬μš©ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έ.
λ˜ν•œ payload μ—μ„œ μ€‘μš”ν•˜κ²Œ μ‚΄νŽ΄λ³΄μ•„μ•Ό ν•  μ •λ³΄λŠ” ν† ν° λ°œν–‰μ‹œκ°„(iat)κ³Ό ν† ν° λ§Œλ£Œμ‹œκ°„(exp).
ν† ν°μ˜ 만료 μ‹œκ°„μ΄ μ§€λ‚˜λ©΄ μƒˆλ‘œμš΄ 토큰을 λ°œκΈ‰ λ°›μ•„μ•Ό 함. (λ³΄μ•ˆ μ€‘μš”)
PAYLOAD μ •λ³΄

{
    "token_type": "access", # ν† ν°μ˜ μ’…λ₯˜. μ—¬κΈ°μ„œλŠ” access ν† ν°μž…λ‹ˆλ‹€.
    "exp": 1656293275, # ν† ν°μ˜ λ§Œλ£Œμ‹œκ°„μž…λ‹ˆλ‹€. (Numeric Date)
    "iat": 1656293095, # ν† ν°μ˜ λ°œν–‰μ‹œκ°„μž…λ‹ˆλ‹€. (Numeric Date)
    "jti": "2b45ec59cb1e4da591f9f647cbb9f6a3", # json token id μž…λ‹ˆλ‹€.
    "user_id": 1 # μ‹€μ œ μ‚¬μš©μžμ˜ id값이 λ“€μ–΄μžˆμŠ΅λ‹ˆλ‹€.
}

 

6. VERIFY SIGNATURE

header μ™€ payload λŠ” μ•”ν˜Έν™” λ˜μ§€ μ•Šκ³  λ‹¨μˆœνžˆ Json → UTF-8 → Base64 ν˜•μ‹μœΌλ‘œ λ³€ν™˜λœ 데이터.
즉 header 와 payload 의 생성 μžμ²΄λŠ” λ„ˆλ¬΄ 쉽고 λˆ„κ΅¬λ‚˜ λ§Œλ“€ 수 μžˆλŠ” 데이터.
λ”°λΌμ„œ μ € λ‘κ°œμ˜ λ°μ΄ν„°λ§Œ μžˆλ‹€λ©΄ 토큰에 λŒ€ν•œ μ§„μœ„μ—¬λΆ€ νŒλ‹¨μ€ μ΄λ£¨μ–΄μ§ˆ 수 μ—†κ²Œ 됨.
κ·Έλž˜μ„œ JWT 의 κ΅¬μ‘°μ—μ„œ κ°€μž₯ λ§ˆμ§€λ§‰μ— μžˆλŠ” VERIFY SIGNATURE λŠ” ν† ν° 자체의 μ§„μœ„μ—¬λΆ€λ₯Ό νŒλ‹¨ν•˜λŠ” μš©λ„λ‘œ μ‚¬μš©ν•¨.
VERIFY SIGNATURE λŠ” Base64UrlEncoding λœ header  와 payload 의 정보λ₯Ό ν•©μΉœ λ’€ SECRET_KET λ₯Ό μ΄μš©ν•˜μ—¬ Hash λ₯Ό μƒμ„±ν•˜μ—¬ μ•”ν˜Έν™” 함.
HMACSHA256 (
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    SECRET_KEY
)

 

 


 

restframework-simplejwt μ‚¬μš©λ²•

ν”„λ‘œμ νŠΈ settings.py
  1. 'rest_framework_simplejwt.authentication.JWTAuuthentication' μΆ”κ°€

  2. REST_FRAMEWORK = {
        'DEFAULT_AUTHENTICATION_CLASSES': [ # session ν˜Ήμ€ token을 μΈμ¦ ν•  ν΄λž˜μŠ€ μ„€μ •
              'rest_framework_simplejwt.authentication.JWTAuthentication',
        ],
    }

 

user μ•± urls.py
  1. from / import μΆ”κ°€
    • from rest_framework_simplejwt.views import (
          TokenObtainPairView,
          TokenRefreshView,
      )
  2. urlpatterns μΆ”κ°€
    • urlpatterns = [
          path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
          path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
      ]

 

ν”„λ‘œμ νŠΈ settings.py
  1. INSTALLED_APPS 에 'rest_framework_simplejwt' μΆ”κ°€
    • INSTALLED_APPS = [
          'rest_framework_simplejwt',
      ]

 

postman 으둜 ν…ŒμŠ€νŠΈ
  1. user/api/token/ 으둜 username κ³Ό password λ₯Ό λ‹΄μ•„μ„œ λ³΄λ‚΄μ£Όμ„Έμš”.
  2. access 토큰과 refresh 토큰 확인

postman ν…ŒμŠ€νŠΈ

 

Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.