ruriruriya

[RESTful API] Python Flask - JWT 로그인한 유저 토큰 유효기간 만료시키는 방법(expires_delta= ) 본문

Python Flask

[RESTful API] Python Flask - JWT 로그인한 유저 토큰 유효기간 만료시키는 방법(expires_delta= )

루리야ㅑ 2023. 12. 14. 07:00
반응형

JWT로 회원가입해서 토큰을 생성하고 로그인할 때 토큰을 발급 받아서 Header에 넣어 실행을 해보았다.
하지만, 요즘 서비스들을 보면 보안 이슈로 로그인 후 일정 시간이 지나면 자동으로 로그아웃이 되어버린다.

로그인 후 토큰 만료 기간을 설정해보자.

 

1. api 클래스 내의 함수 수정

토큰 생성 후 클라이언트에게 응답 시 함수에서
파라미터 expires_delta= 를 추가하여 날짜/시/분/초를 입력하여 유효기간을 설정한다.

 

access_token = create_access_token(result_list[0]['id'], expires_delta= datetime.timedelta(minutes=2))
 
 
from flask import request
from flask_jwt_extended import create_access_token, get_jwt, jwt_required
from flask_restful import Resource
from mysql_connection import get_connection
from mysql.connector import Error

from email_validator import validate_email, EmailNotValidError
from utils import check_password, hash_password


class UserLoginResource(Resource) :

    def post(self) : 

        # 1. 클라이언트로부터 데이터를 받아온다.
        data = request.get_json()

        # 2. 유저 테이블에, 이 이메일주소로
        #    데이터를 가져온다.
        try :
            connection = get_connection()
            query = '''select *
                        from user
                        where email = %s;'''
            record = (data['email'],)

            cursor = connection.cursor(dictionary=True) #sql select 할 땐 꼭 dictionary=True
            cursor.execute(query,record)

            result_list = cursor.fetchall()

            print(result_list)

            cursor.close()
            connection.close()

        except Error as e :
            print(e)
            cursor.close()
            connection.close()
            return {'error':str(e)}, 500

        # 회원가입을 안한 경우, 리스트에 데이터가 없다.
        if len(result_list) == 0 :
            return{"error":"회원가입을 하세요."}, 400

        # 회원은 맞으니까, 비밀번호가 맞는 지 체크한다.
        #(지금 유저가 입력한 비밀번호, DB에 저장되어 있는 비밀번호)
        check = check_password(data['password'], result_list[0]['password']) 

        # 비번이 맞지 않는 경우
        if check == False :
            return {'error' :'비번이 맞지 않습니다.'}, 406 # not access
        
        # JWT 토큰을 만들어서, 클라이언트에게 응답한다.
        access_token = create_access_token(result_list[0]['id'], expires_delta= datetime.timedelta(minutes=2))
        # 토큰 유효기간 만요 시킬 때 datetime.timedelta(파라미터 시분초 등등 변경 가능)
                
        return {'result':'success','access_token':access_token}, 200

 

 

2. postman으로 테스트

먼저 로그인을 하고 token을 복사하여

다른 사용자 서비스 API Headers의 Authorization 키값으로
Bearer앞에 입력한 뒤 한 칸 띄고 토큰을 입력한다.

그리고 Send 버튼을 눌러 서비스를 이용해보면 성공적으로 데이터를 가져오는 것을 볼 수 있다.

 

그 다음 2분 만료기간을 정해뒀으니
2분을 넘긴 뒤 Send를 하면
아래의 결과가 나오는 것을 볼 수 있다.

{
      "msg" : "Token has expired"
}

 

expires_delta= 파라미터로 토큰 만료 기간을 설정하여 시간이 지나면 자동으로 만료 되는 모습을 확인해보았다.

반응형