JWT를 활용한 파이썬 웹 애플리케이션 로그인 시 쿠키 사용 방법

쿠키는 웹 애플리케이션에서 사용자 정보를 유지하기 위해 흔히 사용되는 방법입니다. 하지만 쿠키는 클라이언트 측에 저장되기 때문에 보안에 취약할 수 있습니다.

JWT(JSON Web Token)는 쿠키를 사용하여 사용자 인증 및 세션 관리 기능을 구현할 때 보다 안전한 방법입니다.

우리는 파이썬 Flask 웹 애플리케이션에서 JWT를 활용하여 로그인 시 쿠키를 사용하는 방법을 알아보겠습니다.

1. JWT 설치하기

먼저, 파이썬 환경에서 JWT 라이브러리인 PyJWT를 설치해야 합니다. 다음 명령어를 사용해 설치할 수 있습니다:

pip install PyJWT

2. JWT 토큰 생성하기

로그인을 성공한 후에 JWT 토큰을 생성하여 클라이언트에게 전달해야 합니다. 다음은 토큰 생성 예제입니다:

import jwt

def generate_jwt_token(user_id):
    payload = {
        'user_id': user_id,
    }
    secret_key = 'your-secret-key' # 보안을 위해 실제로는 별도의 비밀 키를 사용해야 합니다.
    token = jwt.encode(payload, secret_key, algorithm='HS256')
    return token.decode('utf-8')

위 코드에서는 jwt.encode() 함수를 사용하여 사용자 아이디를 payload에 담은 후, 비밀 키를 이용해 JWT 토큰을 생성합니다.

3. JWT 토큰 확인하기

이제 클라이언트가 요청을 보낼 때마다 JWT 토큰이 유효한지 확인해야 합니다. 이를 위해 다음과 같은 데코레이터를 작성할 수 있습니다:

import jwt
from flask import request, jsonify

def jwt_required(func):
    def wrapper(*args, **kwargs):
        token = request.cookies.get('jwt_token')

        if not token:
            return jsonify({'message': 'No JWT token provided'}), 401

        secret_key = 'your-secret-key' # 토큰 생성 시 사용한 비밀 키와 동일해야 합니다.

        try:
            payload = jwt.decode(token, secret_key, algorithms=['HS256'])
            kwargs['user_id'] = payload['user_id']
        except jwt.exceptions.ExpiredSignatureError:
            return jsonify({'message': 'Expired JWT token'}), 401
        except jwt.exceptions.InvalidTokenError:
            return jsonify({'message': 'Invalid JWT token'}), 401

        return func(*args, **kwargs)
    
    return wrapper

위 코드는 jwt_required라는 데코레이터를 생성하여 클라이언트 요청에 대해 JWT 토큰의 유효성을 검사합니다. 토큰이 없거나 유효하지 않으면 401 에러를 반환하고, 유효한 경우에는 요청 처리를 계속합니다.

4. JWT 쿠키 설정하기

로그인이 성공한 후 JWT 토큰을 쿠키에 설정하여 클라이언트에게 전달해야 합니다. 다음은 Flask에서 JWT 토큰을 쿠키에 설정하는 예제입니다:

from flask import Flask, jsonify, make_response
import datetime

app = Flask(__name__)

@app.route('/login', methods=['POST'])
def login():
    # 로그인 로직 구현

    user_id = 'user123'
    token = generate_jwt_token(user_id)

    response = make_response(jsonify({'message': 'Login successful'}), 200)
    response.set_cookie('jwt_token', token, expires=datetime.datetime.now() + datetime.timedelta(days=7))
    
    return response

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

위 코드에서는 /login 엔드포인트에 POST 요청이 오면 로그인 로직을 실행한 후, JWT 토큰을 생성하여 쿠키에 설정합니다. 이후에는 response.set_cookie() 함수를 사용하여 클라이언트에게 토큰이 담긴 쿠키를 전달합니다.


JWT를 활용하여 파이썬 웹 애플리케이션에서 로그인 시 쿠키를 사용하는 방법에 대해 알아보았습니다. JWT를 사용하면 쿠키로 사용자 인증 정보를 보내는 과정에서 보다 안전하게 정보를 전송할 수 있습니다.