파이썬 Flask 프레임워크를 이용한 JWT 토큰 발행 및 검증 방법

JWT(Json Web Token)는 웹 개발에서 사용되는 인증과정에서 사용되는 방식 중 하나입니다. 이는 토큰 기반의 인증 방식으로, 사용자의 인증 정보를 포함하고 있는 토큰을 생성하여 클라이언트에게 제공하며, 이를 통해 사용자의 인증과정을 간편하게 처리할 수 있습니다.

Flask-JWT 패키지 설치

먼저, Flask에서 JWT를 사용하기 위해 Flask-JWT 패키지를 설치해야 합니다. 아래의 명령어를 사용하여 설치할 수 있습니다.

$ pip install Flask-JWT

JWT 토큰 발행 및 검증

다음은 Flask-JWT를 사용하여 JWT 토큰을 발행하고 검증하는 방법입니다.

from flask import Flask
from flask_jwt import JWT, jwt_required, current_identity
from werkzeug.security import safe_str_cmp

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
jwt = JWT(app)

class User:
    def __init__(self, id, username, password):
        self.id = id
        self.username = username
        self.password = password

    def __str__(self):
        return f"User(id={self.id}, username={self.username})"

users = [
    User(1, 'john', 'password'),
    User(2, 'jane', 'secret'),
]

def authenticate(username, password):
    user = next((user for user in users if user.username == username), None)
    if user and safe_str_cmp(user.password.encode('utf-8'), password.encode('utf-8')):
        return user

def identity(payload):
    user_id = payload['identity']
    return next((user for user in users if user.id == user_id), None)

@jwt.auth_request_handler
def auth_request_handler():
    """인증 실패 시 커스텀 응답을 생성할 수 있는 핸들러"""
    return jsonify({
        'message': 'Invalid credentials',
        'error': 'authorization_required'
    }), 401

@jwt.jwt_error_handler
def jwt_error_handler(error):
    """토큰 에러에 대한 핸들러"""
    return jsonify({
        'message': 'Token error',
        'error': error.description
    }), 401

@app.route('/protected')
@jwt_required()
def protected():
    return f"Hello, {current_identity}!"

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

위의 예제 코드에서는 Flask-JWT 패키지를 사용하여 JWT 토큰을 발행하고 검증하는 기능을 구현하였습니다. 코드를 살펴보면, Flask 애플리케이션 객체를 생성하고, app.config['SECRET_KEY']로 시크릿 키를 설정한 다음 JWT(app)로 JWT 객체를 생성합니다.

User 클래스는 사용자 정보를 나타내는 클래스이며, users 리스트에 미리 정의된 사용자들을 저장합니다.

authenticate 함수는 사용자의 인증을 위해 호출되는 함수로, 입력받은 사용자명과 패스워드를 확인하여 해당 사용자 객체를 반환합니다.

identity 함수는 인증된 사용자 객체를 반환하는 함수로, JWT 토큰에서 추출한 user_id를 사용하여 users 리스트에서 해당 사용자를 찾아 반환합니다.

auth_request_handlerjwt_error_handler는 각각 인증 실패 및 토큰 에러에 대한 커스텀 응답을 생성하는 핸들러 함수입니다.

마지막으로, @jwt_required() 데코레이터를 사용하여 protected라우트를 보호하고, 인증된 사용자를 환영하는 응답을 생성하는 함수인 protected를 정의합니다.

이제 위의 예제 코드를 실행하면 /protected URL에 접근할 때 JWT 토큰이 필요하며, 토큰이 유효한 경우 해당 사용자를 환영하는 메시지가 반환됩니다.

마무리

이제 파이썬 Flask 프레임워크를 사용하여 JWT 토큰을 발행하고 검증하는 방법을 알아보았습니다. JWT를 활용하면 보안적인 요구사항을 충족시키며, 클라이언트의 인증 과정을 간소화할 수 있습니다.