라이브러리 없이 JWT 토큰 클레임 읽기

3993 단어 pythonwebjwt
웹 앱 작업을 하는 거의 모든 사람은 JWT(JSON 웹 토큰)가 무엇인지 알고 있습니다. 그들은 꽤 인기가 있으며 현재 널리 사용됩니다.

세부 사항으로 이동하지 않고(예: jwt.io/introduction에서 읽을 수 있음) JWT는 점으로 구분된 세 부분으로 구성됩니다.

header.payload.signature


중간 부분인 탑재량은 우리에게 흥미로웠습니다. 엔터티(예: 사용자) 및 일부 추가 데이터에 대한 설명인 클레임을 포함합니다.

이 게시물의 목적을 위해 다음과 같은 jwt.io의 예제 토큰을 사용합니다(디버거에서 열려면 링크를 클릭하십시오!).

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c



토큰의 페이로드는 base64 인코딩된 JSON 객체입니다. 즉, 속성에 쉽게 액세스할 수 있도록 이를 디코딩하고 이 JSON 문자열을 사전에 로드할 수 있습니다.

여기에는 까다로운 부분이 하나뿐입니다. 바로 base64 패딩입니다! JWT의 페이로드는 영숫자만 있으며 = 문자가 없습니다. 제대로 디코딩되도록 하려면 페이로드 문자열에 최대 패딩(==)을 추가해야 합니다. 필요하지 않으면 무시됩니다. 그러나 우리가 거기에 그것을 가지고 있지 않다면 (그러나 그것이있을 것으로 예상되는 경우) - 디코더는 오류를 던질 것입니다.

위의 모든 내용을 Python의 간단한 코드 줄로 요약하면 다음과 같습니다.

import base64
import json
# Assuming the token is in the token variable 
token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9." \
"eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ." \
"SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"
# Split by dot and get middle, payload, part;
token_payload = token.split(".")[1]
# Payload is base64 encoded, let's decode it to plain string
# To make sure decoding will always work - we're adding max padding ("==")
# to payload - it will be ignored if not needed.
token_payload_decoded = str(base64.b64decode(token_payload + "=="), "utf-8")
# Payload is JSON - we can load it to dict for easy access
payload = json.loads(token_payload_decoded)
# And now we can access its' elements - e.g. name
name = payload["name"]
# Let's print it - it should show "John Doe"
print(name)



Replit(Reading JWT token without library on Replit)의 브라우저에서 실행하거나 Python 3을 사용하여 로컬로 실행할 수 있습니다.

그리고 그게 다야. 꽤 간단하죠?

그리고 추가 도구 없이도 할 수 있어서 정말 좋습니다! :-)

좋은 웹페이지 즐겨찾기