hyeseong-dev 2024. 3. 21. 03:35

JWT(Json Web Token)는 인터넷 표준으로, 두 당사자 사이에서 JSON 객체를 사용하여 가볍고 자가수용적인 방식으로 정보를 안전하게 전송하기 위해 설계되었습니다. JWT는 주로 사용자 인증과 정보 교환에 사용됩니다. 자가수용적(self-contained)이라는 것은, 토큰 자체가 필요한 모든 정보를 포함하고 있어, 토큰을 받는 측에서는 추가적인 조회 없이도 해당 정보를 검증하고 사용할 수 있다는 의미입니다.

JWT는 세 부분으로 구성됩니다: Header, Payload, Signature.

 

Header: 토큰의 타입(주로 JWT)과 해싱 알고리즘(예: HMAC SHA256 또는 RSA)이 포함됩니다

 

Payload: 토큰에 포함될 클레임(claim) 정보가 포함됩니다. 클레임은 토큰에 대한 속성값으로, 사용자 인증 정보나 데이터 전송 등에 사용될 정보를 담습니다. 클레임에는 등록된 클레임, 공개 클레임, 비공개 클레임 세 종류가 있습니다.

  • 등록된 클레임: 서비스에서 필요한 정보가 아니라, 토큰에 대해 설명하는 정보입니다. 예를 들어, iss(발행자), exp(만료 시간), sub(주제) 등이 있습니다.
  • 공개 클레임: 충돌이 방지된 이름을 가진 클레임으로, 사용자 정의 정보를 포함할 수 있습니다.
  • 비공개 클레임: 두 당사자 사이에서 협의하에 사용되는 클레임으로, 사용자 정의 정보를 포함할 수 있습니다.

Signature: 서명 부분은 토큰의 무결성과 정보의 검증을 위해 사용됩니다. Header의 인코딩 값과 Payload의 인코딩 값을 합친 후, 제공된 비밀키로 해시하여 생성됩니다. 이 서명을 통해 토큰이 중간에 조작되지 않았는지 확인할 수 있습니다.

JWT는 HTTP 헤더에 Authorization으로 추가되거나 URL의 파라미터로 전송되어 사용됩니다. 이 토큰을 사용함으로써 서버는 각 요청마다 사용자의 세션을 저장할 필요 없이, 토큰만으로 사용자의 인증 상태를 확인할 수 있게 됩니다. 이는 상태를 유지하지 않는(stateless) RESTful 서비스에 매우 적합합니다.


Code example

JWT의 구현 예시를 들어보겠습니다. 여기서는 Python에서 JWT를 다루기 위해 널리 사용되는 PyJWT 라이브러리를 사용할 예정입니다. PyJWT를 사용하면 JWT를 생성하고, 검증할 수 있습니다.

먼저, PyJWT 라이브러리를 설치해야 합니다. 이를 위해 다음 명령어를 사용하세요:

pip install PyJWT

JWT 생성하기

JWT를 생성하기 위해, 먼저 토큰에 포함할 정보(claims)와 사용할 암호화 알고리즘, 그리고 비밀키를 정의해야 합니다. 다음은 간단한 JWT 생성 예시입니다:

import jwt
import datetime

# 비밀키 정의
secret_key = 'your_secret_key'

# 토큰에 포함할 정보(claims)
payload = {
    'sub': '1234567890',  # 주제 (subject)
    'name': 'John Doe',
    'admin': True,
    'exp': datetime.datetime.utcnow() + datetime.timedelta(seconds=600)  # 만료 시간 설정 (10분 후)
}

# JWT 생성
token = jwt.encode(payload, secret_key, algorithm='HS256')
print(token)

JWT 검증하기

JWT를 검증하는 과정에서는 해당 토큰이 유효한지, 만료되지 않았는지, 그리고 예상된 발행자로부터 발행되었는지 등을 확인합니다. 다음은 JWT를 검증하는 예시 코드입니다:

import jwt

# 비밀키 (토큰을 생성할 때 사용한 것과 동일한 키)
secret_key = 'your_secret_key'

# 받은 토큰
token = '여기에_받은_토큰_입력'

# JWT 검증 및 디코딩
try:
    decoded = jwt.decode(token, secret_key, algorithms=['HS256'])
    print(decoded)
except jwt.ExpiredSignatureError:
    print("토큰이 만료되었습니다.")
except jwt.InvalidTokenError:
    print("유효하지 않은 토큰입니다.")

이 코드들은 PyJWT 라이브러리를 이용하여 JWT를 생성하고, 검증하는 기본적인 방법을 보여줍니다. 실제 어플리케이션에 적용할 때는, 보안을 위해 secret_key를 안전하게 관리해야 하며, 필요에 따라 토큰의 claims을 조정하여 사용하세요.