[python] Authlib를 사용하여 애플리케이션에 인증된 사용자 정보를 저장하고 관리하는 방법은?

이 글에서는 Python의 Authlib 라이브러리를 사용하여 애플리케이션에 인증된 사용자 정보를 저장하고 관리하는 방법을 알아보겠습니다.

1. Authlib 소개

Authlib는 OAuth 1.0, OAuth 2.0, OpenID Connect 및 JWT 등 다양한 인증 및 인가 프로토콜을 지원하는 파이썬 라이브러리입니다. 이를 통해 사용자의 인증 및 인가를 처리할 수 있습니다.

2. 인증된 사용자 정보 저장 및 관리

Authlib는 사용자의 인증 정보를 저장하고 관리하기 위해 다양한 방법을 제공합니다. 여기에서는 가장 일반적인 방법 중 하나인 세션 기반 인증을 예로 들어 설명하도록 하겠습니다.

2.1. 세션 기반 인증

세션 기반 인증은 사용자의 정보를 서버의 세션에 저장하여 인증 상태를 유지하는 방식입니다.

먼저 Flask와 Authlib를 사용하여 세션 기반 인증을 설정하는 방법을 살펴보겠습니다. Flask-Login이라는 라이브러리를 사용하여 편리하게 구현할 수 있습니다.

from flask import Flask
from flask_login import LoginManager
from authlib.integrations.flask_client import OAuth

app = Flask(__name__)
app.secret_key = 'your_secret_key'

# Flask-Login 설정
login_manager = LoginManager(app)

@login_manager.user_loader
def load_user(user_id):
    # user_id를 기반으로 사용자 정보를 검색하여 리턴하는 함수
    return User.query.get(int(user_id))

# Authlib OAuth 설정
oauth = OAuth(app)

oauth.register(
    name='google',
    client_id='your_google_client_id',
    client_secret='your_google_client_secret',
    authorize_url='https://accounts.google.com/o/oauth2/auth',
    token_url='https://accounts.google.com/o/oauth2/token',
    userinfo_url='https://www.googleapis.com/oauth2/v1/userinfo',
    client_kwargs={'scope': 'openid profile email'}
)

위의 코드에서는 Flask-Login을 사용하여 사용자 정보를 세션에 저장하고 관리합니다. 사용자 정보를 검색하기 위한 load_user 함수를 정의해야 합니다. 또한, Authlib의 OAuth를 사용하여 Google OAuth를 구성하였습니다.

2.2. 사용자 정보 활용

인증된 사용자의 정보를 활용하는 방법은 다양합니다. 예를 들어 사용자의 프로필 정보를 가져오거나, 사용자의 이메일 주소를 확인하는 등의 작업을 수행할 수 있습니다.

from flask import redirect, url_for, current_user
from authlib.flask.client import OAuth

@app.route('/login')
def login():
    redirect_uri = url_for('authorize', _external=True)
    return oauth.google.authorize_redirect(redirect_uri)

@app.route('/authorize')
def authorize():
    token = oauth.google.authorize_access_token()
    userinfo = oauth.google.parse_id_token(token)
    user = load_user(userinfo['sub'])
    login_user(user)

    # 사용자 정보 활용 예시: 프로필 정보 출력
    print(f"사용자 이름: {userinfo['name']}")
    print(f"사용자 이메일: {userinfo['email']}")

    return redirect('/')

@app.route('/')
def home():
    if current_user.is_authenticated:
        return f"인증된 사용자: {current_user.username}"
    return "인증되지 않은 사용자"

위의 코드에서는 /login 엔드포인트를 통해 Google 로그인 페이지로 리다이렉트하고, /authorize 엔드포인트에서 사용자 정보를 가져온 뒤 Flask-Login의 login_user 함수를 사용하여 사용자를 로그인 상태로 설정합니다. 이후에는 current_user 객체를 통해 인증된 사용자 정보에 접근할 수 있습니다.

3. 마무리

이처럼 Authlib를 사용하여 애플리케이션에 인증된 사용자 정보를 저장하고 관리하는 방법을 알아보았습니다. 세션 기반 인증을 예로 들었지만, Authlib는 다양한 인증 및 인가 방식을 지원하므로 필요에 따라서 다른 방법을 선택할 수도 있습니다.

Authlib의 자세한 내용에 대해서는 공식 문서를 참고하시기 바랍니다.