쿠키는 웹 애플리케이션에서 사용자 정보를 유지하기 위해 흔히 사용되는 방법입니다. 하지만 쿠키는 클라이언트 측에 저장되기 때문에 보안에 취약할 수 있습니다.
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를 사용하면 쿠키로 사용자 인증 정보를 보내는 과정에서 보다 안전하게 정보를 전송할 수 있습니다.