파이썬과 JWT를 활용한 웹 애플리케이션 사용자 인증 로그 저장 방법

개요

웹 애플리케이션에서 사용자 인증을 관리하고 로그를 저장하는 것은 매우 중요합니다. 이를 위해 파이썬과 JWT(Json Web Token)를 함께 활용하여 사용자 인증과 로그 저장을 구현하는 방법을 알아보겠습니다.

JWT란?

JWT란 인증 정보를 안전하게 전달하기 위한 인증 방식입니다. JWT는 JSON 형식으로 토큰을 생성하며, 토큰 내에는 사용자 정보나 기타 필요한 정보들이 포함됩니다. 이 토큰은 서버와 클라이언트 간에 안전하게 전달되며, 인증 정보를 포함하고 있는 토큰을 통해 사용자의 신원을 확인할 수 있습니다.

로그 저장을 위한 데이터베이스 설정

사용자 인증 로그를 저장하기 위해 먼저 데이터베이스를 설정해야 합니다. 가장 일반적인 선택은 MySQL이나 PostgreSQL과 같은 관계형 데이터베이스입니다. 데이터베이스에는 사용자 인증 로그를 저장할 테이블을 만들어 주세요. 테이블은 로그인 시간, 사용자 아이디, IP 주소 등과 같은 필드를 포함해야 합니다.

CREATE TABLE user_logs (
    id INT PRIMARY KEY AUTO_INCREMENT,
    login_time DATETIME,
    user_id INT,
    ip_address VARCHAR(45)
)

JWT를 이용한 사용자 인증 구현

  1. 사용자가 로그인을 하면, 서버는 사용자 식별 정보를 기반으로 JWT를 생성합니다.
import jwt

def generate_jwt(user_id):
    payload = {'user_id': user_id}
    token = jwt.encode(payload, 'secret_key', algorithm='HS256')
    return token.decode('utf-8')
  1. 클라이언트는 서버로부터 받은 JWT를 인증에 사용합니다. 클라이언트는 JWT를 요청 헤더에 포함시켜 서버에 API를 호출합니다.
  1. 서버는 클라이언트로부터 받은 JWT를 디코딩하여 사용자 신원을 확인합니다. JWT의 유효성을 검사하고 올바른 사용자인지 확인합니다.
def decode_jwt(token):
    try:
        payload = jwt.decode(token, 'secret_key', algorithms=['HS256'])
        user_id = payload.get('user_id')
        return user_id
    except jwt.ExpiredSignatureError:
        return None
    except jwt.InvalidTokenError:
        return None
  1. 사용자 인증 로그를 저장하기 위해, 로그인이나 로그아웃할 때마다 로그 테이블에 새로운 로그를 추가합니다.
import datetime
from flask import request
import mysql.connector

def save_log(user_id, ip_address):
    current_time = datetime.datetime.now()
    conn = mysql.connector.connect(
        host="localhost",
        user="username",
        password="password",
        database="database_name"
    )
    cursor = conn.cursor()
    query = "INSERT INTO user_logs (login_time, user_id, ip_address) VALUES (%s, %s, %s)"
    values = (current_time, user_id, ip_address)
    cursor.execute(query, values)
    conn.commit()
    conn.close()

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

결론

파이썬과 JWT를 활용하여 웹 애플리케이션의 사용자 인증과 로그 저장을 구현하는 방법을 알아보았습니다. JWT를 사용함으로써 안전하고 효율적인 인증 방식을 구현할 수 있습니다. 또한 데이터베이스를 이용하여 사용자 로그를 저장하면, 애플리케이션의 보안을 강화하고 사건 조사나 오류 디버깅에 유용한 정보를 얻을 수 있습니다.

#파이썬 #JWT #웹개발 #인증 #로그저장

위의 예시 코드는 Python 언어를 사용한 JWT와 로그 저장 방법을 설명한 것입니다. 특정 웹 애플리케이션 프레임워크에 적용할 경우 코드를 해당 프레임워크에 맞게 수정해야 할 수 있습니다.