API 개발/Restful API

Restful API : JWT 토큰 유효기간 만료 시키는 방법 (timedelta)

신강희 2024. 5. 29. 00:23
728x90

< JWT 토큰 유효기간 만료 시키는 방법 (timedelta) >

 

# 지금까지 회원 가입/로그인, 발급된 토큰을 활용한 API를 개발

- 그렇다면, 발급된 토큰유효기간을 지정해서 특정한 시간이 지나면 사용하지 못하도록 설정해보자.

- 주로, 은행앱이나 관공서앱같이 보안을 위해 일정시간이 지나면 자동으로 로그아웃이 되도록 할때 사용

- 이전에 만들었던 회원가입, 로그인 API에 활용 (참고 : https://sorktjrrb.tistory.com/158)

 

Restful API : 회원가입/로그인 API 에서, 토큰(JWT) 생성해서 처리하는 방법

# 이전 장에서 환경세팅은 모두 완료하였고, 이제 진짜 회원관리 API 개발을 해보자- postman에서 우선 API 설계 및 리퀘스트 생성- POST로 선택하고, 경로와 Body문 작성 # 이제 Visual Studio Code를 실행-

sorktjrrb.tistory.com

 

# 우선 기존에 Config.py 파일에 작성하였던 JWT 관련 변수 셍팅값을 수정해준다.

- JWT_ACCESS_TOKEN_EXPIRES = True 로 변경 후 저장


class Config :

    # JWT 관련 변수 셋팅
    # 실무에서 이 키값은 절대 노출되면 안됨
    JWT_SECRET_KEY = 'yhschool,24575522'
    # False로 설정하면 유효기간이 없고, True로 설정하면 유효기간이 생긴다.
    JWT_ACCESS_TOKEN_EXPIRES = True
    PROPAGATE_EXCEPTIONS = True
 

 

# 회원관리 API를 작성한 user.py 파일에서도 코드를 수정해 준다.

- 해당 설정값만 변경하는게 아니라 토큰 생성시 유효기간을 지정해서 작성해 주어야 한다.

- datetime 임포트도 필요함!

# 토큰 만료시킬때 사용
# expires_delta= datetime.timedelta() 파라미터 안에 원하는 유효시간을 설정
# 일, 시, 분 단위 설정 가능

access_token = create_access_token(user_id, expires_delta= datetime.timedelta(minutes=3))

 

# 전체 코드 (유효시간은 3분으로 설정)

 
# 인증토큰 유효기간 생성 위해서 datetime 임포트
import datetime
 
from email_validator import EmailNotValidError, validate_email

from flask import request
from flask_jwt_extended import create_access_token, jwt_required, get_jwt
from mysql.connector import Error
from flask_restful import Resource

from mysql_connection import get_connection
from utils import check_password, hash_password

# 회원가입 API
class UserRegisterResource(Resource) :
    def post(self) :
        # 1. 클라이언트가 보낸 데이터를 받아준다.
        # 포스트맨으로 작성한 body 데이터를 json으로 받아온다.
        data = request.get_json()
        print(data)
       
        # 2) 데이터가 있는지 확인
        if data.get('email') is None or data.get('email').strip() == '' or \
            data.get('nickname') is None or data.get('nickname').strip() == '' or \
            data.get('password') is None or data.get('password').strip() == ''or \
            data.get('gender') is None:
            return {'result' : 'fail'}, 400

        # 3. 이메일주소 형식이 올바른지 확인
        # 지정된 형식인 EmailNotValidError 사용 (정의된 라이브러리이므로 해당 형식 그대로 사용해야함)
        try :
            validate_email(data['email'])
        except EmailNotValidError as e :
            return {'result' : 'fail', 'error' : str(e)}, 400

        # 4. 비밀번호 길이가 유효한지 체크한다.
        #    예) 비번은 4자리 이상 12 자리 이하
        if len(data["password"]) < 4 or len(data["password"]) > 12 :
            return {'result' : 'fail'}, 400

        # 5. 비밀번호를 암호화 한다.
        password = hash_password( data['password'])
        print(password)

        # 6. DB에 저장한다.
        try :
            connection = get_connection()
            # 이번 쿼리문 작성 주의할점! record에 password는 암호화된 패스워드를 가져와야 하기 때문에 상단에서 암호화                한 변수로 지정해줘야함!
            query = '''insert into user
                (nickname, email, password, gender)
                values
                (%s, %s, %s, %s);'''
            record = (data['nickname'], data['email'], password, data['gender'])
            cursor = connection.cursor()
            cursor.execute(query, record)
            connection.commit()

            ### 중요하다!!!
            ### DB에 회원가입하여, user 테이블에 insert 된 후,
            ### 이 user 테이블의 id 값을 가져와야 한다.
            ### 생성한 변수를 마지막 리턴에 작성하여 클라이언트에게 보내준다.
            user_id = cursor.lastrowid

            cursor.close()
            connection.close()

        except Error as e:
            if cursor is not None:
                cursor.close()
            if connection is not None:
                connection.close()
            return {'result' : 'fail'}, 500
       
        # 6-2. user_id를 바로 클라이언트에게 보내면 안되고,
        ##     JWT 로 암호화 해서, 인증토큰을 보내야 한다.
        ### 토큰 만료시킬때 사용 (3분으로 설정)
       
        access_token = create_access_token(user_id, expires_delta= datetime.timedelta(minutes=3))
           
        # 7. 응답할 데이터를 JSON으로 만들어서 리턴!

        return {"result" : "success", 'access_token' : access_token}
 

 

# 이제 Postman을 사용해서 회원가입 API로 생성된 인증토큰으로 토큰이 필요한 다른 API 동작을 하다가 3분이 지나면 토큰 유효기간이 만료되어서 API가 실행되지 않는다.

 

다음 게시글로 계속~!

 

반응형