사용자에게 발급된 토큰을 삭제하는 것이 아닌
로그아웃한 사용사의 토큰을 서버에서 차단한다.
settings.py
INSTALLED_APPS = [
.... 생략
'rest_framework_simplejwt.token_blacklist',
]
SIMPLE_JWT = {
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=720),
# ACCESS 토큰의 유효 기간 지정
"REFRESH_TOKEN_LIFETIME": timedelta(days=1),
# REFRESH 토큰의 유효기간 지정
"ROTATE_REFRESH_TOKENS": True,
# True로 설정할 경우, refresh token을 보내면 새로운 access token과 refresh token이 반환된다.
"BLACKLIST_AFTER_ROTATION": True,
# True로 설정될 경우, 기존에 있던 refresh token은 blacklist가된다.
.... 생략
def post(self, request,user_id):
owner = get_object_or_404(User,id=user_id)
if request.user == owner:
token = RefreshToken(request.data.get('refresh'))
token.blacklist()
return Response({"message":"로그아웃 하셨습니다."},status=status.HTTP_200_OK)
else:
return Response({"message":"잘못된 접근입니다."},status=status.HTTP_400_BAD_REQUEST)
로그아웃 기능을 구현하기 위한 방법을 몰색해봤습니다.
로그아웃 구현, 즉 사용자의 Token을 어떻게 제거할 것인가?
생각해보니 제거가 불가능할 것 같다, 왜냐하면 토큰은
로컬 환경에 저장되고, 서버는 유효성을 검증하는 절차를 밟기때문
Django black list app 사용
어떤 기능을 하는가?
Refresh Token을 블랙리스트에 추가하여 접근을 차단한다
이 방법은 Refresh Token을 블랙리스트에 추가하는 것이고
사용자는 Refresh Token을 재발급하기 전까지는 Access Token을 발급 받을 수 없습니다.
하지만 이전에 발급 받았던 Access Token을 계속해서 사용 할 수 있습니다.
그래서 Access Token도 블랙리스트에 추가하면 되는거 아닌가? 라는 생각을 했지만
여기서 고려해봐야할 점이
세션 인증 방식과 토큰 인증 방식입니다.
토큰 인증 방식의 장점은 서버 데이터베이스에 저장을 하지 않으므로 stateless(무결성)
즉, 서버에 부담이 가지 않는다는 장점인데
블랙리스트에 추가하는 순간 db에 데이터가 쌓이므로
토큰 인증 방식의 장점이 사라질 수 있습니다.
요약하여 해결 방법은 이것인데
Refresh Token 차단(블랙리스트)
Access Token의 유효기간 단축(5~30분?)합니다.
나의 코드 문제 : 내 코드는 지금 Refresh Token을 차단하지 못하고 있는 것 같다.
놀이 공원에 입장하면, 손목에 자유 이용권 티켓을 받게 된다.
사람들은 자유롭게 놀다가, 집에 갈때 '스스로' 티켓을 버린다.
이와같이, 토큰을 사용자가 직접 삭제하게끔 기능을 유도하는것인데
이 기능은 프론트에서 구현하면 된다.
문제에서 요구했던 post 방식으로 로그아웃 기능을 구현하는 것은
쿠키 인증 방식의 로그아웃을 구현하라 했던 것!
프론트에서 토큰을 삭제하는 기능을 구현한다.
블랙리스트는 로그아웃때 사용하는것이 아니라 admin계정
즉 관리자 계정에서 블랙리스트를 추가하는것이 적합하다고 생각한다.
이러한 생각을 갖게 된 이유는 블랙리스트를 추가하면 그에 대한 데이터가 db에 저장된다. 즉 수많은 사용자가 사용하게 되면 토큰 인증 방식의 무결성 stateless 장점이 무뎌지기 때문에 로그아웃에서 구현하는것은 적합하지 않다 생각이 들었다. 따라서 관리자가 특정한 id의 사용자를 블랙리스트에 추가하는것이 좋을 것 같다는 생각이 들었는데
이러한 특정한 경우가 생기는건, 사용자가 보완 문제로 토큰 재발급을 요청했다던지, 접속을 차단해야하는 악성 유저라던지의 경우가 있을 것 같다는 생각이 들었다.
쿠키 세션 인증 방식의 로그인 기능도 구현해보자.