파이썬 Flask를 사용하여 JWT 토큰 기반의 사용자 로그인 구현하기

Flask는 파이썬으로 웹 애플리케이션을 개발하기 위한 마이크로 웹 프레임워크입니다. 이번 포스트에서는 Flask와 JWT(JSON Web Token)를 조합하여 사용자 로그인을 구현하는 방법을 소개하겠습니다.

JWT란?

JWT는 사용자 인증을 위한 토큰 기반의 인증 방식입니다. 토큰은 인증 정보를 담고 있으며, 서버와 클라이언트 사이에서 주고받을 수 있는 형태로 인코딩됩니다. JWT의 장점 중 하나는 정보를 암호화하여 안전하게 전달할 수 있다는 점입니다.

Flask와 JWT 설치하기

먼저, Flask와 JWT를 설치해야 합니다. 아래의 명령어를 사용하여 설치할 수 있습니다:

pip install flask flask-jwt

Flask 애플리케이션 초기 설정

다음으로, Flask 애플리케이션을 초기 설정해야 합니다. 아래와 같이 코드를 작성해주세요:

from flask import Flask

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

위 코드에서 SECRET_KEY는 JWT를 암호화하는 데 사용되는 비밀 키입니다. 이는 보안을 위해 반드시 설정해야 합니다. 실제로는 암호화된 비밀 키를 사용해야 합니다.

로그인 API 구현하기

이제 로그인을 처리하는 API를 구현해보겠습니다. 아래와 같이 코드를 작성해주세요:

from flask import Flask, request, jsonify
from flask_jwt import JWT, jwt_required

# 유저 데이터베이스 예시
users = [
    {
        'id': 1,
        'username': 'user1',
        'password': 'password1'
    },
    {
        'id': 2,
        'username': 'user2',
        'password': 'password2'
    }
]

def authenticate(username, password):
    user = next((user for user in users if user['username'] == username), None)
    if user and user['password'] == password:
        return user

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

jwt = JWT(app, authenticate, identity)

@app.route('/login', methods=['POST'])
def login():
    username = request.json.get('username')
    password = request.json.get('password')

    user = authenticate(username, password)
    if user:
        token = jwt.jwt_encode_callback(user)
        return jsonify({'token': token})
    else:
        return jsonify({'message': 'Invalid credentials'}), 401

위 코드는 /login 엔드포인트로 POST 요청을 처리합니다. 요청에는 usernamepassword를 JSON 형식으로 전송해야 합니다. 유효한 인증 정보인 경우, JWT 토큰을 생성하여 클라이언트에게 반환합니다.

보호된 API에 접근하기

JWT 기반의 인증은 보호된 API에 접근할 때 유용합니다. 아래와 같이 보호된 API 예시를 작성해보겠습니다:

@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
    return jsonify({'message': 'This is a protected API'})

위 코드는 /protected 엔드포인트로 GET 요청을 처리합니다. @jwt_required() 데코레이터를 사용하여 해당 엔드포인트는 JWT 토큰을 필요로 합니다. 유효한 토큰이 있는 경우에만 접근이 허용됩니다.

마무리

이제 Flask와 JWT를 사용하여 토큰 기반의 사용자 로그인을 구현하는 방법을 알게 되었습니다. JWT는 간편하고 안전한 사용자 인증 방식으로 많은 웹 애플리케이션에 사용됩니다. Flask와 JWT를 함께 사용하면 보안성을 높이고 개발 시간을 단축할 수 있습니다.

#파이썬 #Flask #JWT