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을 조정하여 사용하세요.
'여러가지 > 이것저것' 카테고리의 다른 글
OAuth와 JWT 차이 (1) | 2024.03.21 |
---|---|
OAuth1.0 과 OAuth2.0 (0) | 2024.03.21 |
단방향 암호화 (0) | 2024.03.21 |
비대칭키, 대칭키 암호화 (0) | 2024.03.21 |
동기와 비동기 (0) | 2024.03.18 |