상세 컨텐츠

본문 제목

Python으로 배우는 JSON Web Token 인증의 모든 것

카테고리 없음

by jbmu6 2025. 3. 25. 04:41

본문

Python에서 JSON Web Token을 사용한 인증 방식 이해하기

오늘날 웹 애플리케이션은 사용자 인증 및 권한 부여를 위해 다양한 방법을 사용하고 있습니다. 그 중 JSON Web Token, 즉 JWT는 널리 사용되는 표준이 되었습니다. 이 블로그 글에서는 Python에서 JWT를 사용한 인증 방식을 초보자도 이해할 수 있도록 자세히 설명하겠습니다.

JWT란 무엇인가?

JSON Web Token (JWT)은 클라이언트와 서버 간의 안전한 정보 전송을 위해 사용하는 개방형 표준입니다. JWT는 JSON 객체로 인코딩된 정보를 포함하고 있으며, 주로 다음과 같은 기능을 수행합니다.

  • 인증(Authentication): 사용자의 신원을 확인하는 방식입니다.
  • 정보 교환(Information exchange): 서로 다른 시스템 간의 안전한 데이터 전송을 가능하게 합니다.

JWT의 구조

JWT는 보통 세 부분으로 구성됩니다. 이 세 부분은 점(.)으로 구분됩니다:

  • 헤더(Header): 이 부분은 토큰의 타입과 해싱 알고리즘 정보를 포함합니다.
  • 페이로드(Payload): 사용자의 정보 및 식별자의 데이터가 포함됩니다. 이 데이터는 Base64로 인코딩됩니다.
  • 서명(Signature): 헤더와 페이로드를 비밀키를 사용하여 서명하여 무결성을 보장합니다.

JWT 예시

아래는 JWT의 예시입니다:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MjIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

JWT의 장점

  • 자체 포함(Self-contained): JWT는 필요한 모든 정보를 내장하고 있습니다. 이를 통해 추가적인 데이터베이스 호출 없이 검증이 가능합니다.
  • 상태 비저장(Stateless): 서버가 JWT를 저장할 필요가 없고, 클라이언트가 토큰을 보관합니다. 이렇게 하면 서버의 부담이 줄어듭니다.
  • 다양한 플랫폼 지원: JWT는 JSON 형식으로 되어 있기 때문에 다양한 플랫폼에서 쉽게 사용할 수 있습니다.

Python에서 JWT를 사용하는 방법

필수 라이브러리 설치하기

Python에서 JWT를 사용하기 위해서는 PyJWT 라이브러리를 설치해야 합니다. 이를 위해 아래의 명령어를 터미널에 입력합니다:

pip install PyJWT

JWT 생성하기

다음은 JWT를 생성하는 간단한 코드 예제입니다:

import jwt
import datetime

비밀키 설정


SECRETKEY = 'yoursecret_key'

사용자 데이터


payload = {
    'userId': 1234,
    'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1)

만료 시간 설정


}

JWT 생성


token = jwt.encode(payload, SECRET_KEY, algorithm='HS256')
print(token)

JWT 검증하기

JWT를 검증하는 방법은 다음과 같습니다:

try:
    decodedpayload = jwt.decode(token, SECRETKEY, algorithms=['HS256'])
    print(decoded_payload)
except jwt.ExpiredSignatureError:
    print('토큰이 만료되었습니다.')
except jwt.InvalidTokenError:
    print('유효하지 않은 토큰입니다.')

Flask와 JWT 통합하기

Flask 웹 프레임워크를 사용하여 JWT 인증을 구현하는 방법은 다음과 같습니다:

from flask import Flask, request, jsonify
import jwt
import datetime

app = Flask(name)
SECRETKEY = 'yoursecret_key'

@app.route('/login', methods=['POST'])
def login():

사용자 로그인 처리


    user_id = request.json['userId']

JWT 생성


    token = jwt.encode({'userId': userid, 'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1)}, SECRETKEY, algorithm='HS256')
    return jsonify(token=token)

@app.route('/protected', methods=['GET'])
def protected():
    token = request.headers.get('Authorization')

    if not token:
        return jsonify({'message': '토큰이 필요합니다.'}), 401

    try:
        decodedpayload = jwt.decode(token, SECRETKEY, algorithms=['HS256'])
        return jsonify({'message': '보호된 데이터에 접근했습니다.', 'userId': decoded_payload['userId']})
    except jwt.ExpiredSignatureError:
        return jsonify({'message': '토큰이 만료되었습니다.'}), 401
    except jwt.InvalidTokenError:
        return jsonify({'message': '유효하지 않은 토큰입니다.'}), 401

if name == 'main':
    app.run(debug=True)

JWT 사용 시 주의할 사항

비밀키 관리

JWT의 안전한 사용을 위해서는 비밀키를 안전하게 관리해야 합니다. 비밀키가 외부에 노출되면, 누군가 그 키를 사용하여 유효한 토큰을 생성할 수 있습니다.

만료 시간 설정

JWT는 일반적으로 만료 조건을 설정하여 사용합니다. 만료 시간이 설정되지 않은 JWT는 무제한으로 사용될 수 있기 때문에 주의가 필요합니다.

유효성 검사

서버에서 받은 JWT의 유효성을 반드시 검증해야 합니다. 검증하지 않고 그대로 사용하면 보안에 심각한 문제가 발생할 수 있습니다.

종합 정리

JSON Web Token은 Python에서 사용자 인증 및 권한 부여를 구현하는 데 매우 유용한 도구입니다. 간단한 방법으로 생성하고 사용할 수 있으며, 다양한 플랫폼과 호환됩니다. 그러나 보안상의 이유로 비밀키 관리와 여러 가지 주의사항을 지켜야 합니다.

JWT를 통한 인증 방식은 현대 웹 애플리케이션에서 중요한 역할을 하며, 이를 이해하고 적절히 활용하는 것이 개발자에게는 필수적인 기술입니다. 앞으로도 JWT에 대한 이해를 바탕으로 더욱 발전된 웹 서비스를 구축해 나가기를 바랍니다.

</>