JWT를 활용한 파이썬 웹 API의 사용자 인증 로직 설계

소개

이 글에서는 파이썬 웹 API에서 JWT(JSON Web Token)을 이용하여 사용자 인증 로직을 설계하는 방법에 대해 알아보겠습니다. JWT는 웹 애플리케이션에서 사용자 인증과 관련된 정보를 안전하게 전달하기 위해 사용되는 표준 방법입니다.

JWT란?

JWT는 세 개의 파트로 나뉘어진 문자열로 구성됩니다. 이 세 개의 파트는 다음과 같습니다.

  1. Header: 토큰의 타입과 해싱 알고리즘 정보가 포함됩니다.
  2. Payload: 토큰에 담길 정보들이 포함됩니다. 이 정보는 클레임(Claim)이라고도 불립니다.
  3. Signature: 토큰의 유효성 검증을 위한 서명값으로, 앞의 두 파트를 기반으로 생성됩니다.

JWT를 이용한 사용자 인증 로직 설계

  1. 사용자 인증 API 엔드포인트 생성: 사용자가 로그인하고 인증 토큰을 받을 수 있는 API 엔드포인트를 만듭니다. 클라이언트에서는 사용자의 아이디와 패스워드를 이 엔드포인트에 전송하여 토큰을 받습니다.

  2. 토큰 생성 로직 구현: 받은 사용자 정보로부터 JWT를 생성하는 로직을 구현합니다. 이때, JWT의 payload에는 사용자의 고유 식별자와 권한 정보 등을 담을 수 있습니다.

import jwt

def generate_token(user_id):
    payload = {
        'user_id': user_id,
        'role': 'user'
    }
    token = jwt.encode(payload, 'secret_key', algorithm='HS256')
    return token
  1. 인증 검증 데코레이터 작성: API의 보호된 엔드포인트에 접근할 때에는 토큰의 유효성을 검사해야 합니다. 이를 위해 데코레이터를 작성하여 엔드포인트에 적용합니다.
from functools import wraps
from flask import request, jsonify

def auth_required(f):
    @wraps(f)
    def decorated_function(*args, **kwargs):
        token = request.headers.get('Authorization')
        if not token:
            return jsonify({'message': '인증되지 않았습니다.'}), 401

        try:
            payload = jwt.decode(token, 'secret_key', algorithms=['HS256'])
            # 토큰에서 필요한 정보를 추출하여 사용할 수 있습니다.
            user_id = payload['user_id']
            role = payload['role']
            # 필요한 추가적인 검증 로직을 작성할 수 있습니다.
        except jwt.InvalidTokenError:
            return jsonify({'message': '유효하지 않은 토큰입니다.'}), 401

        return f(*args, **kwargs)

    return decorated_function
  1. 보호된 API 엔드포인트에 인증 검증 데코레이터 적용: 사용자 인증이 필요한 엔드포인트에는 앞서 작성한 인증 검증 데코레이터를 적용합니다.
from flask import Flask

app = Flask(__name__)

@app.route('/protected')
@auth_required
def protected_route():
    return jsonify({'message': '보호된 엔드포인트에 접근하셨습니다.'})

결론

이번 글에서는 JWT를 활용하여 파이썬 웹 API의 사용자 인증 로직을 설계하는 방법에 대해 알아보았습니다. JWT를 이용하면 토큰 기반의 사용자 인증 시스템을 구축할 수 있으며, 이를 통해 웹 API의 보호 및 애플리케이션의 보안을 강화할 수 있습니다.

#Python #WebAPI #JWT