[python] Marshmallow와 JWT를 함께 사용하여 인증 및 권한 부여 기능 구현하기

개요

인증 및 권한 부여는 웹 어플리케이션에서 중요한 기능 중 하나입니다. 이 기능을 구현하기 위해 Marshmallow와 JWT를 함께 사용하여 보안성을 높인 인증 시스템을 구축할 수 있습니다. 이 글에서는 Python 언어를 기반으로 Marshmallow와 JWT를 이용하여 인증 및 권한 부여 기능을 구현하는 방법에 대해 알아보겠습니다.

필요한 패키지 설치하기

먼저 필요한 패키지를 설치해야 합니다. 다음 명령어를 사용하여 필요한 패키지를 설치합니다.

pip install marshmallow
pip install PyJWT

사용자 인증 모델 생성하기

인증 시스템을 구축하기 위해 사용자 모델을 생성해야 합니다. Marshmallow를 사용하여 사용자 모델을 정의할 수 있습니다. 다음은 사용자 모델의 예시입니다.

from marshmallow import Schema, fields

class UserSchema(Schema):
    id = fields.Int()
    username = fields.Str()
    password = fields.Str()

로그인 엔드포인트 생성하기

사용자 인증을 처리하기 위한 로그인 엔드포인트를 생성합니다. 이 엔드포인트는 사용자가 제공한 사용자명과 비밀번호를 검증하고 JWT 토큰을 발급하는 역할을 합니다. 다음은 로그인 엔드포인트의 예시입니다.

from flask import Flask, request, jsonify
from flask_jwt_extended import create_access_token
from werkzeug.security import check_password_hash
from user_schema import UserSchema

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']
    user = User.query.filter_by(username=username).first()

    if user and check_password_hash(user.password, password):
        access_token = create_access_token(identity=user.id)
        return jsonify(access_token=access_token), 200
    else:
        return jsonify(message='Invalid username or password'), 401

보호된 엔드포인트 생성하기

인증된 사용자만 접근 가능한 보호된 엔드포인트를 생성합니다. JWT 토큰을 받아 인증된 사용자임을 검증한 후 처리 로직을 수행하게 됩니다. 다음은 보호된 엔드포인트의 예시입니다.

from flask_jwt_extended import jwt_required, get_jwt_identity

@app.route('/protected', methods=['GET'])
@jwt_required()
def protected():
    current_user_id = get_jwt_identity()
    user = User.query.get(current_user_id)
    return jsonify(user=UserSchema().dump(user)), 200

마치며

이번 글에서는 Marshmallow와 JWT를 함께 사용하여 인증 및 권한 부여 기능을 구현하는 방법에 대해 알아보았습니다. 이를 참고하여 웹 어플리케이션의 보안성을 높일 수 있습니다. 추가적으로, 사용자 모델에 필요한 필드 및 사용자 관련 CRUD 기능은 구현되어야 합니다.

참고 자료