인증(authentication): 로그인, 아이디와 패스워드를 통해 회원임을 인증 받는 것
인가(autherization): 회원으로만 할 수 있는 행동을 할 때 서버가 회원임을 확인하고 행동을 인가하는 것
인가를 위해 매 요청마다 아이디와 비밀번호가 담겨서 날아다니면 보안상 위험하며 매번 비밀번호가 알고리즘으로 암호화된 계산값과 일치하는지 확인하는 작업을 거쳐야 해서 시간과 자원을 많이 사용하게 된다.
특징
인가 과정
단점
Refresh Token
Django로 JWT 확인하기
django에서 JWT access token을 발급받아 이를 JWT 공식 사이트에서 decode 해보았다.
#serializers.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
class SellerTokenObtainPairSerializer(TokenObtainPairSerializer):
@classmethod
def get_token(cls, user):
if user.is_staff == True:
token = super().get_token(user)
token['username'] = user.username
token['email'] = user.email
token['is_staff'] = user.is_staff
return token
django에서 위 코드를 통해 유저에게 JWT 토큰을 반환할 때 username, email, is_staff 정보가 추가로 payload에 담기게 되며 이외의 정보들을 추가할 수 있다.
마지막 서명에서는 헤더, 페이로드, 비밀키를 암호화 했음을 알 수 있다.
다음은 django에서 JWT 관한 설정들이다.
#settings.py
'''
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_simplejwt.authentication.JWTAuthentication',
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
),
}
'''
SIMPLE_JWT = {
'ACCESS_TOKEN_LIFETIME': timedelta(minutes=30),
'REFRESH_TOKEN_LIFETIME': timedelta(days=14),
'ROTATE_REFRESH_TOKENS': True,
'BLACKLIST_AFTER_ROTATION': True,
'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),
}
먼저 Django REST Framework에서 인가를 위해 JWT를 사용했기 때문에 REST Framework의 DEFAULT_AUTHENTICATION_CLASSES
에 rest_framework_simplejwt.authentication.JWTAuthentication
를 추가해주었다.
다음으로 simple JWT 설정을 확인해보면,
access token의 만료시간은 30분, refresh token의 만료기간은 2주로 설정된 것을 확인할 수 있다.
또한 암호화 알고리즘은 'HS256'이며, 서명을 만드는데 사용된 비밀키는 django의 SECRET_KEY
와 동일하게 설정해주었다.