본문 바로가기

카테고리 없음

JWT 생성 및 실습

반응형



JWT 는 말그대로 JSON을 이용한 Web Token 이다. 서비스에 대한 인증이나 CSRF 토큰등에 사용된다.
JWT 구조:
Header + Payload + Signature 로 구성됩니다.

header payload signature
ㅣ | |
iamheader iampayload iamsignature
header 는 암호화 알고리즘 과 type
payload 는 전송할 내용

jwt 는 python , java, ruby,.net, perl,javascript 등 다수의 언어를 지원한다.

예제로서 python3 를 사용하도록 한다.

jwt 파이썬 라이브러리를 설치
#pip3 install jwcrypto

#아래 코드는 python JSON Web token tutorial 을 그대로 가져온 것이다.

#Create a symmetric key::
from jwcrypto import jwt, jwk
key = jwk.JWK(generate='oct', size=256)
symmkey = key.export()
print(symmkey)

#Create a signed token with the generated key::

Token = jwt.JWT(header={"alg": "HS256"},claims={"info": "hello world I'm jwt"})
Token.make_signed_token(key)
generatekey = Token.serialize()
print(generatekey)

#Further encrypt the token with the same key::

Etoken = jwt.JWT(header={"alg": "A256KW", "enc": "A256CBC-HS512"},claims=Token.serialize())
Etoken.make_encrypted_token(key)
encryptkey = Etoken.serialize()
print(encryptkey)

#Now decrypt and verify::

k = symmkey
#key = jwk.JWK(**k)
e = encryptkey
ET = jwt.JWT(key=key,jwt=e)
ST = jwt.JWT(key=key,jwt=ET.claims)
result = ST.claims
print(result)

#### result #######


{"k":"OjmQiB7ntfri7zK1voRYd3rof5XKPn-wt8r-vvbdyG4","kty":"oct"}


eyJhbGciOiJIUzI1NiJ9.eyJpbmZvIjoiaGVsbG8gd29ybGQgSSdtIGp3dCJ9.tA6b7r7siLGrcZKxR-MW4_v7BYA3P79ZZcvAuuiGAfI


eyJhbGciOiJBMjU2S1ciLCJlbmMiOiJBMjU2Q0JDLUhTNTEyIn0.rV7t949p88Nmv9ImrAcfqzAwfOMOcPMVm-w9Xe8CvKd2YJCG_-nyv5ZZkdm_3_krSDIGKeTdwPkpASXyl0MovzVXhKSUbRVL.-0GLdOy8vEHA6R1wvj9IPA.jgj_Qz3fJM0vCmCT_jjD6z8NyuL_qNcf49D8nbn7gWbgilWgQXRlf06gfReAiWjsNW4dCX6_oHEH69Xl0Lyf4DnvYdYSChgRD_frUU58Psccwmj1xsM0c0iwe6ZYtK1c_tmR4qf5zQ4Fna2ueqbp-A.2Ci6K8O_krYg7hkIDshHgech_K_euV77ug1nPE2NHwc

{"info":"hello world I'm jwt"}




 토큰 값 디코딩


base64.b64decode('eyJhbGciOiJIUzI1NiJ9')
b'{"alg":"HS256"}'

토큰 값의 header 부분을 디코딩 하니 어떤 암호화 알고리즘을 사용했는지 출력된다.


저 토큰 값을  웹 개발시 localStorage 나 쿠키 속에 넣어서 사용 한다면 사용자로서는 조심해야 할 부분인거 같다.


generatekey 또한 디코딩

base64.b64decode('eyJpbmZvIjoiaGVsbG8gd29ybGQgSSdtIGp3dCJ9')
b'{"info":"hello world I\'m jwt"}'


원본 payload 메시지가 디코딩 된다. 

물론 최종 인코딩된 토큰 값에서 추출하면 안되겠지만 저 부분까지 유추 할 수 있다면 JWT 도 안전한 인증방식은 안될것 같다.







참고: 

https://jwt.io/
http://jwcrypto.readthedocs.io/en/latest/jwt.html

https://www.base64decode.org/









반응형