[python] Authlib를 사용하여 애플리케이션에 JWT 토큰을 사용하여 사용자 인증 구현하는 방법은?

이번 블로그 포스트에서는 Authlib 라이브러리를 사용하여 JWT(Json Web Token) 토큰을 이용한 사용자 인증 구현 방법에 대해 알아보겠습니다.

필요한 라이브러리 설치

Authlib를 사용하기 위해 다음 명령어를 사용하여 필요한 라이브러리를 설치합니다.

pip install Authlib[flask]

기본 설정

from authlib.integrations.flask_oauth2 import AuthorizationServer
from authlib.integrations.flask_oauth2 import ResourceProtector
from authlib.integrations.flask_oauth2 import current_token

from flask import Flask, jsonify
from werkzeug.security import gen_salt

app = Flask(__name__)
app.config['SECRET_KEY'] = gen_salt(24)

위의 코드에서는 Flask app을 생성하고, SECRET_KEY를 생성하여 설정하였습니다.

Authorization Server 설정

from authlib.jose import jwt

def query_client(client_id):
    # 클라이언트 아이디를 기반으로 인증서버에 등록된 클라이언트 정보를 조회하는 함수
    # 해당 클라이언트가 등록된 클라이언트인지 확인하는 로직을 작성하면 됩니다.
    return Client.query.filter_by(client_id=client_id).first()

def generate_jwt_token(user):
    # 사용자 정보를 바탕으로 JWT 토큰을 생성하는 함수
    header = {'alg':'RS256', 'typ':'JWT'}
    payload = {'sub': user.id, 'name': user.name}
    return jwt.encode(header, payload, private_key)

authorization = AuthorizationServer(app)

@authorization.clientgetter
def get_client(client_id):
    return query_client(client_id)

@authorization.tokengetter
def load_token(access_token=None, refresh_token=None):
    if access_token:
        return query_token(access_token)
    if refresh_token:
        return query_token(refresh_token)

@authorization.token_validator
def validate_token(request):
    return current_token.validate()


@app.route('/oauth/token', methods=['POST'])
def issue_token():
    return authorization.create_token_response()

위의 코드에서는 AuthorizationServer를 설정하고, 필요한 메서드들을 구현합니다.

query_client 함수는 클라이언트 아이디를 이용하여 등록된 클라이언트 정보를 조회하는 로직을 작성해야 합니다.

generate_jwt_token 함수는 사용자 정보를 바탕으로 JWT 토큰을 생성하는 로직을 작성해야 합니다.

get_client 함수는 클라이언트 아이디를 기반으로 등록된 클라이언트 정보를 조회하는 함수를 작성해야 합니다.

load_token 함수는 액세스 토큰 또는 리프레시 토큰을 로드하는 데 사용됩니다.

validate_token 함수는 토큰 검증 로직을 작성해야 합니다.

/oauth/token 엔드포인트는 토큰을 발행하는 데 사용됩니다.

Resource Protector 설정

from authlib.flask.oauth2 import requires_oauth

resource_protector = ResourceProtector()

@app.route('/api/user_info', methods=['GET'])
@requires_oauth('profile')
def get_user_info():
    user = get_current_user()
    return jsonify(user.to_dict())

위의 코드에서는 ResourceProtector를 설정하고, 요청된 API 엔드포인트에 @requires_oauth 데코레이터를 추가합니다. 이를 통해 해당 API에 접근하는 사용자가 유효한 토큰을 가지고 있는지 확인합니다.

get_user_info 엔드포인트는 로그인한 사용자의 정보를 반환하는 함수입니다. 이 함수에 requires_oauth('profile') 데코레이터를 추가하여, profile 스코프를 요구하는 토큰을 가진 사용자만 접근할 수 있도록 설정합니다.

결론

이번 포스트에서는 Authlib를 사용하여 JWT 토큰을 이용한 사용자 인증을 구현하는 방법을 알아보았습니다. Authlib는 강력하고 유연한 인증 라이브러리이므로 안전한 애플리케이션을 개발하면서 JWT 토큰을 사용한 사용자 인증을 구현하고자 한다면 Authlib를 고려해보세요.

더 자세한 내용은 Authlib 문서를 참조하시기 바랍니다.