JWT를 활용한 파이썬 API 서버의 로그인 시 쿠키 사용 방법과 로그 관리 정책 설계 방법

개요

최근 웹 애플리케이션의 보안 관련 이슈가 늘어나면서, 사용자 인증에 대한 중요성이 대두되고 있습니다. JWT(JSON Web Token)는 인증 정보를 안전하게 전달하기 위한 방법 중 하나입니다. 이번 글에서는 JWT를 사용하여 파이썬 API 서버에 로그인 기능을 구현하는 방법과 로그 관리 정책을 설계하는 방법에 대해 알아보겠습니다.

JWT 쿠키 사용 방법

  1. 먼저, JWT 토큰을 발급하기 위해 사용자의 아이디와 비밀번호를 확인합니다.
  2. 유효한 사용자라면, 서버는 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
  1. 클라이언트는 쿠키에 저장된 토큰을 서버에 요청할 때마다 함께 전송합니다. 서버는 유효한 토큰인지 검증하여 사용자를 인증합니다.
@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

로그 관리 정책 설계 방법

  1. 사용자의 로그인 실패 및 성공 시 로그를 기록합니다. 이를 통해 잘못된 로그인 시도나 이상한 접근을 감지할 수 있습니다.
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)
        # ...

  1. 로그 파일을 주기적으로 검토하여 비정상적인 접근이나 보안 위험이 있는지 확인합니다. 필요한 경우 해당 로그를 분석하여 추가적인 보안 조치를 취할 수 있습니다.
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서버 #로그인 #쿠키 #로그관리정책