ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JWT 생성 및 실습
    카테고리 없음 2017. 10. 10. 11:49
    반응형



    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/









    반응형
Designed by Tistory.