DRF JWT, CORS 란? / TIL_221026
JWT(Json Web Token)란?
- JWT란 모바일이나 웹의 사용자 인증을 위해 사용하는 암호화된 토큰을 의미한다. JWT는 클라이언트에서 HTTP 리퀘스트 헤더에 JSON 토큰을 넣어 보내면 서버는 헤더에 포함되어 있는 JWT 정보를 통해 인증한다.
- JWT 인증 과정
1. 클라이언트에서 사용자의 인증 정보를 서버에 전달
2. 서버는 인증 정보로 인증을 처리하고 JWT를 생성하여 클라이언트에 전달
3. 클라이언트는 JWT를 브라우저에 저장
4. 클라이언트는 이후 이러어지는 요청에 JWT를 이용
5. 서버는 JWT를 검증하여 인증을 처리
6. JWT가 만료되면 토큰을 refresh
- Simple-JWT 설치 및 세팅
pip install djangorestframework-simplejwt
# setting.py
INSTALLED_APPS = [
...
'rest_framework_simplejwt',
...
]
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
)
}
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
'ROTATE_REFRESH_TOKENS': False,
'BLACKLIST_AFTER_ROTATION': False,
'UPDATE_LAST_LOGIN': False,
'ALGORITHM': 'HS256',
'SIGNING_KEY': SECRET_KEY,
'VERIFYING_KEY': None,
'AUDIENCE': None,
'ISSUER': None,
'JWK_URL': None,
'LEEWAY': 0,
'AUTH_HEADER_TYPES': ('Bearer',),
'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',
'USER_ID_FIELD': 'id',
'USER_ID_CLAIM': 'user_id',
'USER_AUTHENTICATION_RULE': 'rest_framework_simplejwt.authentication.default_user_authentication_rule',
'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
'TOKEN_TYPE_CLAIM': 'token_type',
'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',
'JTI_CLAIM': 'jti',
'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),
'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),
}
CORS(Cross Origin Resource Sharing) 란?
- 브라우저에서 보안적인 이유로 corss-origin HTTP 요청들을 제한한다. 그래서 corss-origin 요청을 하려면 서버의 동의가 필요하다. 만약 서버가 동의한다면 브라우저에서는 요청을 허락하고, 동의하하지 않는다면 브라우저에서 거절한다. 이러한 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이용해서 가능한데, 이를 CORS라고 부른다.
- CORS가 필요한 이유
출처가 다른 두 개의 애플리케이션이 마음대로 소통하는 환경은 위험한 환경이다. 웹으로 돌아가는 클라이언트 애플리케이션은 사용자 공격에 매우 취약하다. 개발자 도구만 열더라도 DOM, JavaScript코드 등 각종 통신 정보를 쉽게 열람할 수 있다. 이를 통해서 사용자가 악의를 가지고 다른 사이트로 본 사이트를 모방할 수 있다. 이렇게 다른 출처의 어플리케이션이 통신하는 것에 제약이 없다면, 기존 사이트와 동일하게 동작하여 사용자의 정보가 탈취되기 쉬워진다.
- CORS가 동작하는 원리
웹 애플리케이션이 다른 출처의 리소스에 접근할 때는 HTTP header에 요청을 보낸다고 하였다. HTTP 프로토콜을 사용하여 요청을 보내며, 요청 헤더에 Origin 필드에 요청을 보내는 출처를 담아서 보낸다.
이후 서버가 이 요청에 대한 응답을 할 때 응답 헤더의 Access-Control-Allow-Origin 이라는 값에 "리소스 접근이 허용된 출처"를 내려주고, 응답을 받은 브라우저는 자신이 보낸 Origin과 서버가 보내준 응답인 Access-Control-Allow-Origin 을 비교하고 유효한 응답인지 확인한다. 만약 유효하지 않으면 그 응답을 사용하지 않는다.
- CORS 설치 및 세팅
pip install django-cors-headers
# setting.py
INSTALLED_APPS = [
...
"corsheaders",
...
]
MIDDLEWARE = [
"corsheaders.middleware.CorsMiddleware",
...
]
CORS_ALLOW_ALL_ORIGINS = True