ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JWT(Json Web Token)
    스프링/스프링 시큐리티 2024. 1. 12. 19:33

    세션은 간단하게 말하자면 클라이언트의 요청이 있을 때 세션 저장소에 사용자의 정보를 넣어두는 형식이다.

     

    하지만 만약에 로드 밸런싱을 통하여 서버를 분할한다면 세션 저장소를 3개로 나누는 것도 애매하고, 하나로 통합하자니 너무 복잡하고 성능상 느려질 수 있다는 단점도 존재한다.

     

    이러한 문제점을 해결하기 위해 JWT(Json Web Token)을 사용한다. 클라이언트가 요청을 보내면 서버는 세션이 아니라 JWT를 만드는 것이다.

     

    또한 JWT는 통신에서 CIA를 지키기 위한 RSA를 사용하기 때문에 안전하다.

     

     

    JWT(Json Web Token)란?

    정보를 JSON 객체로 안전하게 전송하기 위한 개방형 표준이다.

     

    이 정보는 디지털 서명이 되어 있어서 신뢰할 수 있다.

    서명된 토큰은 정보의 무결성을 확인할 수 있게 해준다.

     

     

    JWT 웹 토큰의 구조

    xxxxx.yyyyy.zzzzz

    xxxxx : header

    yyyyy : payload

    zzzzz : signature

     

    헤더

    헤더는 일반적으로 토큰 유형(JWT)와 사용중인 서명 알고리즘(RSA 또는 HMAC SHA256)의 두 부분으로 구성된다.

     

    payload

    pay load는 등록된 클레임과 개인 클레임으로 이루어진다.

    등록된 클레임에는 iss(발생자), exp(만료 시간), sub(주제), aud(청중) 등이 들어간다. (필수는 아니지만 권장되는 클레임)

    개인 클레임 공간에는 유저를 특정할 수 있는 값을 넣어준다. (userId 등 웹에서 사용되는 정보를 넣을 수 있음)

     

    signature

    서명 부분에는 header, payload와 secret key가 들어간다. 이러한 값들을 HMAC SHA256 알고리즘으로 암호화를 한다.

     

     

    각각 Base64Url로 인코딩 되어있어서 암호화 및 복구화가 가능하며 이걸 서버가 클라이언트에게 넘겨주는 것이다.

     

     

    HMAC SHA256(HS256) 방식

    클라이언트는 웹 브라우저의 로컬 스토리지에 저장해놨다가 서버에 요청할 때 JWT를 함께 보내며 요청한다.

    서버는 header+payload+secret key를 가지고 HS256으로 암호화를 해보고, 클라이언트가 보낸 JWT와 같으면 payload의 user 정보를 응답한다.

     

     

    RSA 방식

    위에는 HS256에 대한 설명이며 만약에 RSA로 진행한다면 약간 다르다.

    RSA에는 secret key가 필요가 없다. RSA는 공개키와 개인키가 존재한다. header와 payload를 개인키로 잠궈서 signature를 만들고 클라이언트에게 넘겨준다. 클라이언트는 토큰을 받아서 서버쪽으로 요청할 때 해당 토큰을 다시 넘긴다.

    서버는 공개키로 signature를 검증하기만 하면 된다.

Designed by Tistory.