[파이썬] Flask와 JWT 인증

Flask는 파이썬으로 개발된 마이크로 웹 프레임워크로서, 간단하고 가볍게 웹 애플리케이션을 개발할 수 있게 도와줍니다. 이에 더하여 JWT(JSON Web Token)는 사용자 인증과 데이터 교환을 위한 표준 방식으로 사용되며, Flask와 함께 사용하면 안전하고 간편한 인증 기능을 구현할 수 있습니다.

JWT 인증을 Flask에서 사용하려면 몇 가지 단계를 거쳐야 합니다. 먼저 필요한 패키지를 설치해야 합니다. 다음 명령을 사용하여 Flask-JWT 패키지를 설치할 수 있습니다:

pip install flask-jwt

이제 Flask-JWT를 기반으로 JWT 인증을 구현할 수 있습니다. Flask-JWT는 JWT 토큰을 생성, 확인 및 관리하는 데 사용됩니다. 다음은 Flask에서 JWT 인증을 구현하는 간단한 예제 코드입니다:

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

app = Flask(__name__)
app.config['SECRET_KEY'] = 'my-secret-key' # JWT 암호화에 사용할 키

# 사용자 정보를 저장할 예제 데이터베이스
users = [
    {"id": 1, "username": "user1", "password": "password1"},
    {"id": 2, "username": "user2", "password": "password2"}
]

# JWT 토큰을 생성하는 함수
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

# JWT 토큰을 확인하는 함수
def identity(payload):
    user_id = payload["identity"]
    return next((user for user in users if user["id"] == user_id), None)

# JWT 토큰 생성 및 확인을 위한 설정
jwt = JWT(app, authenticate, identity)

# 인증이 필요한 엔드포인트
@app.route('/protected')
@jwt_required()
def protected():
    return jsonify({'id': current_identity["id"], 'username': current_identity["username"]})

# 로그인 엔드포인트
@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username', None)
    password = request.json.get('password', None)
    if not username or not password:
        return jsonify({"error": "인증 정보가 올바르지 않습니다"}), 400

    user = authenticate(username, password)
    if not user:
        return jsonify({"error": "인증 실패"}), 401

    # JWT 토큰 생성
    access_token = jwt.jwt_encode_callback(user)
    return jsonify({'access_token': access_token.decode('utf-8')})

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

위 코드에서는 Flask-JWT를 사용하여 /login 엔드포인트에서 사용자 인증을 수행하고 JWT 토큰을 생성합니다. /protected 엔드포인트에서는 jwt_required() 데코레이터를 사용하여 인증이 필요한 엔드포인트로 설정하였습니다. 사용자 인증 정보가 올바르다면 보호된 데이터를 반환합니다.

이 예제는 간단한 JWT 인증 구현을 보여주며, 실제 애플리케이션에서는 보안 문제에 대한 고려와 더 많은 기능을 추가해야 할 수 있습니다. 그러나 Flask와 JWT를 함께 사용하면 안전하고 강력한 인증 기능을 쉽게 구현할 수 있습니다.

참고 자료: