[파이썬] JWT (JSON Web Token)를 사용한 인증과 권한 관리

인증과 권한 관리는 웹 어플리케이션 개발에서 매우 중요한 부분이다. 이를 위해 다양한 인증 방식과 권한 제어 메커니즘들이 사용되고 있는데, 그 중 하나가 JWT (JSON Web Token) 이다. JWT는 웹 표준으로서, 정보를 안전하게 전달하기 위해 사용되는 암호화된 토큰이다.

JWT는 세 개의 파트로 구성된 문자열로 이루어져 있다. header, payload, signature 이렇게 세 개의 파트는 각각 . 으로 분리되어 있다. 이 때 headerpayload 는 Base64URL로 인코딩되어 있고, signature 는 인코딩된 header, payload 및 비밀 키를 사용하여 생성되는 HMAC (Hash-based Message Authentication Code) 혹은 RSA 알고리즘을 통해 생성되는 서명값이다.

JWT는 사용자의 인증 정보를 토큰에 담고 있기 때문에, 서버 측에서 이 토큰을 검증하여 사용자의 인증과 권한을 확인할 수 있다. 예를 들어, 웹 클라이언트가 로그인을 하면 서버는 해당 사용자에 대한 정보를 JWT로 발급하고, 이후 클라이언트가 서버에 요청을 보낼 때마다 JWT를 함께 전송하여 인증과 권한 검증을 수행한다.

Python에서 JWT를 사용하기 위해서는 PyJWT 라이브러리를 설치해야 한다. 아래는 간단한 예제 코드이다.

import jwt

# 비밀 키
secret_key = 'mysecretkey'

# 토큰 생성
def generate_token(user_id):
    payload = {'user_id': user_id}
    token = jwt.encode(payload, secret_key, algorithm='HS256')
    return token

# 토큰 검증
def verify_token(token):
    try:
        payload = jwt.decode(token, secret_key, algorithms=['HS256'])
        return payload['user_id']
    except jwt.ExpiredSignatureError:
        return "Token expired"
    except jwt.InvalidTokenError:
        return "Invalid token"

# 사용 예시
token = generate_token(1234)
print(token)

user_id = verify_token(token)
print(user_id)

위 코드에서 generate_token 함수는 주어진 사용자 ID를 기반으로 JWT를 생성한다. 인코딩 알고리즘으로는 HS256 (HMAC-SHA256) 을 사용하고 있다. verify_token 함수는 주어진 토큰을 검증하여 유효한 경우 해당 사용자의 ID를 반환하고, 만료된 토큰이거나 유효하지 않은 토큰인 경우에는 각각 “Token expired” 혹은 “Invalid token” 을 반환한다.

이처럼 JWT를 사용하여 인증과 권한 관리를 구현할 수 있다. JWT는 토큰의 유효성을 검사하기 위해 서버의 데이터베이스를 조회하지 않고도 간단하게 검증할 수 있으며, 분산 시스템에서 유용하게 사용될 수 있다. 하지만 보안 취약점에 대한 주의가 필요하며, 비밀 키를 안전하게 보관하는 것이 매우 중요하다.

더 많은 기능과 옵션에 대해서는 PyJWT 라이브러리의 공식 문서를 참고하면 된다. JWT를 사용한 인증과 권한 관리는 웹 개발에서 필수적인 요소 중 하나이므로, 꼭 익혀두는 것이 좋다.

참고: PyJWT 공식 문서