Table of Contents
인증 #
- 입력한 ID와 Password를 통해 사용자의 신원을 검증하는 절차
- 인증을 위해, 사전에 사용자의 정보들을 생성하고 저장할 수 있는 기능 필요
- ex) 입력한 ID와 Password를 DB에 저장된 내용과 비교
인가 #
- 로그인 후 사용자가 요청한 request를 실행할 권한을 부여하는 과정
- ex) 로그인 성공 시 access token을 클라이언트에게 전송 로그인 성공 후 다음 request부터는 access token을 첨부해서 서버에 요청 전송 서버는 access token을 통해 사용자의 권한을 확인 해당 권한을 가지고 있으면 요청을 처리 해당 권한을 가지고 있지 않으면 Unauthorized Response(401) 혹은 다른 에러 코드를 보냄
JWT #
- Json Web Token
- 클라이언트와 서버, 서비스와 서비스 사이 통신 시 권한인가(Authorization)를 위해 사용하는 토큰
- URL에 대해 안전한 문자열로 구성되어 있음
JWT 구성 #
- (Header.Payload.Signature)로 구성됨
-
"."으로 구조를 구분함
1) Header
- type: 토큰 유형 (JWT)
- alg : 어떤 해싱 함수를 사용할 것인지
(이 알고리즘은 토큰을 검증할 시 사용되는 signature 부분에서 사용됨)
- 해싱 함수: 임의의 길이의 데이터를 고정된 길이의 데이터로 매핑하여 암호화하는 함수{ "typ": "JWT", "alg": "HS256" }
2) Payload
- 토큰에 담을 정보
- 하나의 정보를 클레임(claim)이라 부름
- (따라서 Payload에 있는 속성들은 클레임 셋이라 부름)
- 클레임은 name: value의 한 쌍으로 이루어짐
- 클레임 셋은 토큰 생성자(클라이언트)의 정보, 생성 일시 등이나 클라이언트와 서버 간 전송되는 데이터가 들어있음3) Signature
- Header와 Payload의 인코딩 값을 합쳐 주어진 비밀키(SECRET_KEY)로 해쉬함
Django에서 JWT 사용하는 방법 #
- Django REST framework JWT 라이브러리 사용
- djangorestframework–jwt: django의 Restful API에서 JWT를 쉽게 구현할 수 있게 도와주는 모듈
Django REST FRAMEWORK JWT settings 설정 #
- 아래와 같이 settingss.py에 추가 필요
-
REST_FRAMEWORK = { #접근 권한을 설정하는 클래스 'DEFAULT_PERMISSION_CLASSES': ( #인증된 사용자만 접근할 수 있게 하는 것 'rest_framework.permissions.IsAuthenticated', ), #인증 방식을 설정하는 클래스 'DEFAULT_AUTHENTICATION_CLASSES': ( # JWT를 사용 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', # 밑의 내용은 기본 설정 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), }
-
JWT_AUTH = { #JWT의 비밀키 (secret key)로 어떤 걸 사용할지 'JWT_SECRET_KEY': SECRET_KEY, #JWT 암호화에 사용되는 알고리즘 지정 'JWT_ALGORITHM': 'HS256', #JWT 토큰을 갱신 가능한지에 대한 여부 'JWT_ALLOW_REFRESH': True, # JWT 토큰의 유효기간 설정 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=7), # JWT 토큰 갱신의 유효기간 'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=28), }
Django REST FRAMEWORK URL 설정 #
-
# JWT 토큰 발행 from rest_framework_jwt.views import ( obtain_jwt_token, # JWT 토큰 유효성 검증 verify_jwt_token, # JWT 토큰 갱신 refresh_jwt_token
-
urlpatterns = [ path('admin/', admin.site.urls), path('api/token/', obtain_jwt_token), path('api/token/verify/', verify_jwt_token), path('api/token/refresh/', refresh_jwt_token), ]