파이썬 Flask를 사용하여 JWT 토큰 만료 처리 방법

개요

JWT(Json Web Token)는 인증과 데이터 교환을 안전하게 수행하기 위한 방법 중 하나입니다. 토큰은 사용자를 인증하고 유효성을 검증하는 데 사용됩니다. 이 문서에서는 파이썬 Flask 프레임워크를 사용하여 JWT 토큰의 만료 처리 방법을 소개합니다.

JWT 토큰 만료 기능 추가하기

  1. Flask에서 JWT 토큰 만료 기능을 추가하기 위해 PyJWT 모듈을 설치합니다.
    pip install PyJWT
    
  2. Flask 애플리케이션에서 JWT 토큰 만료를 처리하기 위해 다음 코드를 추가합니다. ```python from datetime import datetime, timedelta import jwt

토큰 발행 시간과 만료 시간 설정

issued_at = datetime.utcnow() expiration = issued_at + timedelta(minutes=30)

토큰 생성 함수

def create_token(user_id): payload = { ‘user_id’: user_id, ‘exp’: expiration, ‘iat’: issued_at } token = jwt.encode(payload, ‘SECRET_KEY’, algorithm=’HS256’) return token

토큰 유효성 검증 함수

def verify_token(token): try: payload = jwt.decode(token, ‘SECRET_KEY’, algorithms=[‘HS256’]) return payload except jwt.ExpiredSignatureError: return {‘error’: ‘Token expired’} except jwt.InvalidTokenError: return {‘error’: ‘Invalid token’}


3. 토큰을 생성하는 부분에서 토큰의 만료 시간(`'exp'`)을 설정합니다. 상기 예제에서는 현재 시간으로부터 30분 후로 설정했습니다.

4. 토큰이 유효한지 검증하는 함수에서 만료된 토큰이나 잘못된 토큰을 처리하기 위해 `jwt.ExpiredSignatureError`와 `jwt.InvalidTokenError` 예외 처리를 추가합니다.

## JWT 토큰 만료 기능 테스트하기
1. Flask 애플리케이션에서 토큰 생성 및 검증 기능을 테스트하기 위해 다음 코드를 추가합니다.
```python
from flask import Flask, jsonify, request

app = Flask(__name__)

# 테스트용 유저 데이터
users = [
    {'id': 1, 'name': 'Alice'},
    {'id': 2, 'name': 'Bob'}
]

# 로그인 API
@app.route('/login', methods=['POST'])
def login():
    user_id = request.get_json().get('user_id')
    if user_id:
        token = create_token(user_id)
        return jsonify({'token': token}), 200
    else:
        return jsonify({'error': 'Invalid user_id'}), 400

# 리소스 접근 API
@app.route('/resource', methods=['GET'])
def get_resource():
    token = request.headers.get('Authorization')

    if token and 'Bearer' in token:
        token = token.split(' ')[1]
        payload = verify_token(token)

        if 'error' in payload:
            return jsonify(payload), 401

        user_id = payload.get('user_id')
        user = next((user for user in users if user['id'] == user_id), None)

        if user:
            return jsonify({'user': user}), 200
        else:
            return jsonify({'error': 'User not found'}), 404
    else:
        return jsonify({'error': 'Invalid token'}), 400

if __name__ == '__main__':
    app.run()
  1. 위 코드에는 로그인 기능을 담은 /login API와 접근 권한이 있는 리소스를 반환하는 /resource API가 포함되어 있습니다.

  2. /login API를 호출하여 사용자 토큰을 얻습니다. 토큰은 응답에 포함됩니다.

  3. Bearer 토큰을 Authorization 헤더에 포함하여 /resource API에 요청합니다. 유효한 토큰이 제공되면 해당 사용자의 리소스가 반환됩니다.

  4. 만료된 토큰이나 잘못된 토큰을 사용하여 /resource API에 요청하면 에러 메시지가 반환됩니다.

요약

이 문서에서는 파이썬 Flask 프레임워크를 사용하여 JWT 토큰의 만료 처리 방법을 소개했습니다. JWT 토큰을 생성하고 유효성을 검증할 수 있는 함수를 구현하며, 테스트용으로 간단한 로그인 및 리소스 접근 API를 만들어 토큰 만료 기능을 확인했습니다.

#JWT #토큰 #만료 #파이썬 #Flask