JWT를 활용한 파이썬 API 서버의 로그인 시 쿠키 사용 방법과 로그 관리 정책 설계 방법
개요
최근 웹 애플리케이션의 보안 관련 이슈가 늘어나면서, 사용자 인증에 대한 중요성이 대두되고 있습니다. JWT(JSON Web Token)는 인증 정보를 안전하게 전달하기 위한 방법 중 하나입니다. 이번 글에서는 JWT를 사용하여 파이썬 API 서버에 로그인 기능을 구현하는 방법과 로그 관리 정책을 설계하는 방법에 대해 알아보겠습니다.
JWT 쿠키 사용 방법
- 먼저, JWT 토큰을 발급하기 위해 사용자의 아이디와 비밀번호를 확인합니다.
- 유효한 사용자라면, 서버는 JWT 토큰을 생성하고 클라이언트에게 응답과 함께 쿠키로 토큰을 전달합니다.
import jwt
from datetime import datetime, timedelta
from flask import Flask, request, make_response
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'
@app.route('/login', methods=['POST'])
def login():
username = request.json['username']
password = request.json['password']
# 아이디와 비밀번호 확인 로직 구현
if username == 'admin' and password == 'admin123':
# JWT 토큰 생성
token = jwt.encode({'username': username, 'exp': datetime.utcnow() + timedelta(hours=1)}, app.config['SECRET_KEY'], algorithm='HS256')
# 응답과 함께 쿠키로 토큰 전달
response = make_response({'message': 'Login successful'})
response.set_cookie('access_token', token, httponly=True)
return response
return {'message': 'Invalid credentials'}, 401
- 클라이언트는 쿠키에 저장된 토큰을 서버에 요청할 때마다 함께 전송합니다. 서버는 유효한 토큰인지 검증하여 사용자를 인증합니다.
@app.route('/protected', methods=['GET'])
def protected_route():
token = request.cookies.get('access_token')
if not token:
return {'message': 'Unauthorized'}, 401
try:
# 토큰 검증과정
payload = jwt.decode(token, app.config['SECRET_KEY'], algorithms=['HS256'])
username = payload['username']
# 인증 된 사용자 처리 로직
return {'message': f'Hello, {username}'}
except jwt.ExpiredSignatureError:
return {'message': 'Expired token'}, 401
except jwt.InvalidTokenError:
return {'message': 'Invalid token'}, 401
로그 관리 정책 설계 방법
- 사용자의 로그인 실패 및 성공 시 로그를 기록합니다. 이를 통해 잘못된 로그인 시도나 이상한 접근을 감지할 수 있습니다.
def log_login_attempt(username, success):
log_message = f"{datetime.now()} - {'Successful' if success else 'Failed'} login attempt for username: {username}"
# 로그 파일에 기록
with open('login_logs.txt', 'a') as file:
file.write(log_message + '\n')
@app.route('/login', methods=['POST'])
def login():
username = request.json['username']
password = request.json['password']
# 로그인 성공 여부 확인
if username == 'admin' and password == 'admin123':
log_login_attempt(username, True)
# ...
else:
log_login_attempt(username, False)
# ...
- 로그 파일을 주기적으로 검토하여 비정상적인 접근이나 보안 위험이 있는지 확인합니다. 필요한 경우 해당 로그를 분석하여 추가적인 보안 조치를 취할 수 있습니다.
def review_login_logs():
with open('login_logs.txt', 'r') as file:
logs = file.readlines()
# 로그 분석 및 보안 조치 로직 구현
# ...
# 예를 들어 매일 밤 11시에 로그 검토
from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
scheduler.add_job(review_login_logs, 'cron', hour=23)
scheduler.start()
결론
JWT를 사용하여 파이썬 API 서버에 로그인 기능을 구현하고, 쿠키를 통해 토큰을 전달하는 방법과 로그 관리 정책 설계 방법에 대해 알아보았습니다. 이러한 구현과 정책은 웹 애플리케이션의 보안 향상에 도움을 줄 수 있으며, 보다 안전한 인증과 권한 관리 시스템을 구축하는 데 도움이 될 것입니다.
#JWT #파이썬 #API서버 #로그인 #쿠키 #로그관리정책