web/django

Django JWT 토큰 기반의 인증 방식 환경 세팅하기

민사민서 2024. 5. 20. 18:32

로직 흐름

회원가입
- 클라이언트는 회원가입에 필요한 정보를 request body에 담아서 보낸다.
- 서버는 이를 받아서 DB에 저장하고, 해당 유저를 인증할 때 사용될 토큰(access, refresh)을 생성한 다음 이를 쿠키에 담아 보낸다. (보통 회원가입 하면 로그인까지 한 번에 되므로)
- 클라이언트는 받은 토큰을 브라우저에 저장해 둔다.

회원가입이 완료된 유저의 로그인
- 클라이언트는 로그인에 필요한 정보를 body에 담아서 보낸다.
- 서버는 이 정보를 바탕으로 DB에 접근하여 등록된 User가 있는지 확인하고, 있을 경우 유저 인증에 사용될 토큰(access, refresh)을 생성한 다음 쿠키에 담아 보낸다.
- 클라이언트는 토큰을 브라우저에 저장해 둔다.

권한이 필요한 기타 작업들
- 클라이언트가 헤더에 자신이 가지고 있는 토큰(access)을 담아서 요청을 보낸다.
- 서버는 받은 토큰을 해석하여 해당 User가 누구인지 알아낸다. (인증)
- 만약 확인된 User 정보가 해당 작업을 해도 되는 User 정보와 일치한다면 해당 작업을 수행한 다음 알맞은 응답을 보낸다. (인가) (ex. 확인된 User 정보와 post의 작성자가 동일하면 post 수정 작업을 허가한다)

 

JWT 기본 세팅

pip install djangorestframework-simplejwt
pip freeze > requirements.txt

 

seminar/settings.py 에 가서

INSTALLED_APPS = [
	...
    "rest_framework_simplejwt",
]

installed_app 리스트에 추가

REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": (
      "rest_framework.permissions.AllowAny",
    ),
    "DEFAULT_AUTHENTICATION_CLASSES": (
        "rest_framework_simplejwt.authentication.JWTAuthentication",
    ),
}

REST_FRAMEWORK 리스트에 default authentication classes에다가도 추가

 

from datetime import timedelta

REST_USE_JWT = True

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30), ### 1 -> access token의 수명을 30분으로 설정
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1), ### 1 -> refresh token의 수명을 하루로 설정
    'ROTATE_REFRESH_TOKENS': True,
    'BLACKLIST_AFTER_ROTATION': True,
    'AUTH_HEADER_TYPES': ('Bearer', ), ### 2 -> 토큰 인증 방식을 bearer로 설정
    'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken', ),
    'ACCESS_TOKEN': 'access_token',
    'REFRESH_TOKEN': 'refresh_token',
}

맨 아래에 다음과 같은 코드들도 추가

- access, refresh token 의 유효기간(life cycle)

- token 을 Bearer Token 인증 방식을 통해 주고 받겠다

// bearer token 은 token 을 소유한 사람에게 액세스 권한을 부여하는 일반적인 token 클래스