[python] Marshmallow를 사용하여 JWT 토큰 기반 인증 방식 구현하기

인증은 웹 애플리케이션에서 중요한 부분입니다. JWT(Jason Web Token)는 토큰 기반 인증 방식 중 하나로, 클라이언트와 서버 간의 인증을 간편하게 처리할 수 있습니다.

Marshmallow는 Python의 직렬화 및 역직렬화 라이브러리로, 데이터를 JSON 형식으로 변환하고 검증할 수 있습니다. 이번 예제에서는 Marshmallow를 사용하여 JWT 토큰 기반 인증 방식을 구현해보겠습니다.

패키지 설치

먼저 Marshmallow를 설치해야 합니다. 아래 명령을 사용하여 Marshmallow를 설치하세요.

pip install marshmallow

사용자 인증 정보 모델링하기

인증에 필요한 사용자 정보를 모델링합니다. 예제에서는 이름과 비밀번호 필드를 가지고 있는 User 모델을 사용합니다.

from marshmallow import fields, Schema

class User:
    def __init__(self, name, password):
        self.name = name
        self.password = password

class UserSchema(Schema):
    name = fields.Str()
    password = fields.Str()

JWT 토큰 생성하기

이제 사용자 인증 후 JWT 토큰을 생성하는 함수를 작성합니다. PyJWT 라이브러리를 사용하여 JWT 토큰을 생성합니다. 아래는 토큰을 생성하는 함수의 예입니다.

import jwt

def generate_token(user):
    payload = {"name": user.name}
    token = jwt.encode(payload, "secret", algorithm="HS256")
    return token

여기서 payload는 토큰에 담길 데이터입니다. jwt.encode 함수는 payload, 비밀키, 알고리즘을 인자로 받아 JWT 토큰을 생성합니다.

토큰 검증하기

클라이언트로부터 받은 JWT 토큰을 검증하는 함수를 작성합니다.

def verify_token(token):
    try:
        payload = jwt.decode(token, "secret", algorithms=["HS256"])
        return payload
    except jwt.ExpiredSignatureError:
        # 토큰이 만료된 경우
        return "Token expired. Please log in again."
    except jwt.InvalidSignatureError:
        # 토큰이 유효하지 않은 경우
        return "Invalid token. Please log in again."

jwt.decode 함수를 사용하여 토큰 데이터를 디코딩합니다. 만약 토큰이 만료된 경우 ExpiredSignatureError 예외가 발생하고, 유효하지 않은 토큰인 경우 InvalidSignatureError 예외가 발생합니다.

사용하기

이제 위에서 작성한 함수와 모델을 사용하여 JWT 토큰 기반의 인증을 구현할 수 있습니다.

user = User("john", "password123")
token = generate_token(user)
print(token)

payload = verify_token(token)
if isinstance(payload, dict):
    print("Token verified. User:", payload["name"])
else:
    print(payload)

generate_token 함수를 사용하여 토큰을 생성한 후, verify_token 함수를 사용하여 토큰을 검증합니다. 검증 결과에 따라 인증 성공 혹은 실패 메시지를 출력합니다.

결론

이번 예제에서는 Marshmallow와 PyJWT 라이브러리를 사용하여 JWT 토큰 기반 인증 방식을 구현하는 방법을 알아보았습니다. JWT는 간편하고 확장성 있는 인증 방식이기 때문에 많은 웹 애플리케이션에서 사용되고 있습니다. Marshmallow를 사용하면 데이터의 직렬화 및 검증을 편리하게 처리할 수 있으며, PyJWT를 사용하여 JWT 토큰 생성과 검증을 간편하게 할 수 있습니다.

더 자세한 내용은 아래 참조 링크를 확인하세요.