JWT를 활용한 파이썬 웹 API의 사용자 인증 로직 설계
소개
이 글에서는 파이썬 웹 API에서 JWT(JSON Web Token)을 이용하여 사용자 인증 로직을 설계하는 방법에 대해 알아보겠습니다. JWT는 웹 애플리케이션에서 사용자 인증과 관련된 정보를 안전하게 전달하기 위해 사용되는 표준 방법입니다.
JWT란?
JWT는 세 개의 파트로 나뉘어진 문자열로 구성됩니다. 이 세 개의 파트는 다음과 같습니다.
- Header: 토큰의 타입과 해싱 알고리즘 정보가 포함됩니다.
- Payload: 토큰에 담길 정보들이 포함됩니다. 이 정보는 클레임(Claim)이라고도 불립니다.
- Signature: 토큰의 유효성 검증을 위한 서명값으로, 앞의 두 파트를 기반으로 생성됩니다.
JWT를 이용한 사용자 인증 로직 설계
-
사용자 인증 API 엔드포인트 생성: 사용자가 로그인하고 인증 토큰을 받을 수 있는 API 엔드포인트를 만듭니다. 클라이언트에서는 사용자의 아이디와 패스워드를 이 엔드포인트에 전송하여 토큰을 받습니다.
-
토큰 생성 로직 구현: 받은 사용자 정보로부터 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
- 인증 검증 데코레이터 작성: 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
- 보호된 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