Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Tags
more
Archives
Today
Total
관리 메뉴

Nonamed Develog

[TIL][240905] RefreshToken 속 check_blacklist() 본문

WHAT I LEARN/TIL

[TIL][240905] RefreshToken 속 check_blacklist()

노네임드개발자 2024. 9. 5. 20:22

문제 상황

Django REST Framework로 로그아웃 기능을 구현하던 중, 사용자가 POST 요청으로 refresh_token을 보냈을 때 **{"detail": "This token is already blacklisted."}**라는 에러가 발생했다. 이는 이미 블랙리스트에 등록된 토큰을 처리하려 할 때 발생한 문제였다.

문제 원인

SignoutView 클래스에서 RefreshToken 객체의 check_blacklist() 메서드를 호출할 때, 이미 블랙리스트에 등록된 토큰이 있을 경우 TokenError가 발생하면서 해당 에러 메시지가 반환되었다. 이 문제는 사용자가 이미 로그아웃한 상태에서 발생할 수 있다.

초기 코드

class SignoutView(APIView):
    permission_classes = [IsAuthenticated]
    def post(self, request):
        refresh_token_str = request.data.get("refresh_token")
        refresh_token = RefreshToken(refresh_token_str)
        try:
            refresh_token.check_blacklist()
        except TokenError as e:
            return Response({"msg": "This token is already blacklisted.",}, status=400)
        refresh_token.blacklist()
        return Response(status=200)

문제 분석

위 코드는 refresh_token이 이미 블랙리스트에 등록되어 있는지 확인한 후, 해당 토큰이 블랙리스트에 있을 경우 에러를 발생시킨다. 이로 인해 토큰이 이미 블랙리스트에 등록된 상태에서 요청이 들어오면 문제가 발생하며, 사용자는 요청이 실패한 것처럼 인식하게 된다.

해결 방법

토큰이 이미 블랙리스트에 있더라도 에러를 발생시키지 않고 정상적으로 로그아웃 처리가 되도록 코드를 수정할 필요가 있다. TokenError가 발생했을 때도 성공적으로 처리된 것으로 간주하고, 로그아웃을 완료한 것처럼 응답을 보내는 방식으로 변경했다.

수정 코드 (예시)

 

class SignoutView(APIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        refresh_token_str = request.data.get("refresh_token")
        refresh_token = RefreshToken(refresh_token_str)
        try:
            # 블랙리스트에 등록 시도
            refresh_token.blacklist()
        except TokenError:
            # 이미 블랙리스트에 있을 경우에도 성공 응답 반환
            return Response({"msg": "Token already blacklisted."}, status=200)
        return Response(status=200)

결과

수정된 코드에서는 토큰이 이미 블랙리스트에 있어도 에러가 발생하지 않으며, 요청이 성공적으로 처리된다. Postman을 통해 테스트한 결과, 이미 블랙리스트에 있는 토큰에 대해서도 정상적인 응답이 반환되었다.

배운 점

  • TokenError 처리의 중요성: 이미 블랙리스트에 등록된 토큰에 대해 불필요한 에러를 발생시키지 않고, 처리 과정을 간소화하는 것이 사용자 경험을 개선할 수 있다.
  • 블랙리스트 로직 최적화: 에러를 줄이고, 토큰 상태에 관계없이 요청을 성공적으로 처리하는 흐름을 만드는 것이 중요하다.