[python] 인증 토큰 만료 처리하기

웹 애플리케이션에서는 보안을 위해 사용자의 인증을 처리하는데 인증 토큰을 사용합니다. 이 인증 토큰은 일정 시간이 지나면 만료되는데, 만료된 토큰으로는 사용자의 요청을 처리할 수 없습니다. 따라서, 토큰이 만료되었을 때 적절한 처리를 해주어야 합니다. 이번 포스트에서는 Python을 사용하여 인증 토큰의 만료를 처리하는 방법에 대해 알아보겠습니다.

JWT 토큰과 만료 처리

JWT(Json Web Token) 토큰은 인증을 위해 사용되는 자가 수용적 인증 서버에 의해 발행됩니다. 이 토큰에는 사용자의 정보와 토큰의 유효기간이 포함되어 있습니다. 만료 시간 이후에는 유효하지 않은 토큰으로 간주되어 사용자의 요청을 거부해야 합니다.

만료 시간 확인하기

토큰이 만료되었는지 확인하기 위해서는 토큰의 만료 시간을 확인해야 합니다. JWT 토큰의 만료 시간은 토큰의 payload에 있는 “exp”라는 필드에서 확인할 수 있습니다. 따라서, 토큰을 파싱하여 “exp” 필드의 값을 가져온 후 현재 시간과 비교하여 토큰이 만료되었는지 여부를 판단할 수 있습니다.

import jwt
from datetime import datetime

def is_token_expired(token):
    payload = jwt.decode(token, verify=False)
    exp = payload.get('exp')
    current_time = datetime.utcnow().timestamp()
    if exp and current_time > exp:
        return True
    return False

위의 코드에서는 jwt.decode() 함수를 사용하여 토큰의 payload를 디코딩한 후, “exp” 필드의 값을 가져오고 현재 시간과 비교합니다. 토큰이 만료되었으면 True를, 그렇지 않으면 False를 반환합니다.

만료 처리

토큰이 만료되었을 경우, 사용자에게 다시 인증을 요청하도록 안내해야 합니다. 이러한 처리를 위해 보통은 401 Unauthorized 상태 코드를 반환하고, 클라이언트는 해당 응답을 받았을 때 다시 인증을 진행하도록 구현합니다. 아래는 Flask 웹 프레임워크를 사용한 예시입니다.

from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/protected')
def protected_route():
    token = request.headers.get('Authorization')
    if not token or is_token_expired(token):
        return jsonify({'error': 'Token expired'}), 401
    # 인증된 사용자에 대한 처리 로직
    return jsonify({'message': 'Access granted'})

if __name__ == '__main__':
    app.run()

위의 코드에서는 클라이언트의 요청 헤더에서 토큰을 추출한 후 is_token_expired() 함수를 사용하여 토큰이 만료되었는지 여부를 확인합니다. 토큰이 만료되었을 경우 401 Unauthorized 상태 코드와 함께 에러 메시지를 반환하고, 그렇지 않은 경우에는 인증된 사용자에 대한 처리 로직을 수행합니다.

결론

이번 포스트에서는 Python을 사용하여 인증 토큰의 만료를 처리하는 방법에 대해 알아보았습니다. 인증 토큰의 만료 여부를 확인하고, 만료되었을 경우 적절한 처리를 해줌으로써 보안을 강화할 수 있습니다.