JWT

루미·2022년 8월 11일
0

Spring

목록 보기
5/11

JSON Web Token은 유저를 인증하고 식별하기 위한 토큰 기반의 인증이다. 토큰은 세션과 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지를 통해 세션을 관리했던 서버의 부담을 줄일 수 있는 방법이다. JWT가 가지는 핵심적인 특징은 토큰 자체에 사용자의 권한정보나 서비스를 이용하기 위한 정보가 포함되어 있다는 것이다. 데이터가 많이지면 토큰이 커질 수 있으며 토큰이 한 번 발급된 이후 사용자의 정보를 바꾼다면, 토큰을 재발급 해야 정보가 반영된다.

JWT를 사용하면 RESTful과 같은 Stateless 환경에서 사용자 데이터를 주고받을 수 있게 된다. 세션을 사용하게 될 경우 쿠키등을 통해 식별하고 서버에 세션을 저장했지만 JWT와 같은 토큰을 클라이언트에 저장하고 요청할 경우 HTTP 헤더에 토큰을 첨부하는 것만으로도 단순하게 데이터를 요청하고 응답을 받아올 수 있다.

일반적으로 JWT 를 사용하면 아래와 같은 순서로 진행된다.

  1. User가 ID, PASSWORD를 통해 웹서비스 인증
  2. 서버에 서명된(signed) JWT를 생성하여 클라이언트에 응답으로 돌려주기
  3. 클라이언트가 서버에 데이터를 추가적으로 요구할 때 JWT를 HTTP Header에 첨부
  4. 서버에서 클라이언트로부터 온 JWT를 검증

JWT는 JSON 데이터를 base64 URL-safe Encode를 통해 인코딩하여 직렬화 한 것이 포함되며 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 존재한다. 따라서 사용자가 JWT를 서버로 전송하면 서버는 서명을 검증하는 과정을 거치게 되며 검증이 완료되면 요청과 응답을 돌려준다.


구조

JWT는 Header, Payload, Signature 3가지로 구성되어 있고 각각 .으로 구분된다. Header에는 JWT에서 사용할 타입과 해시 알고리즘의 종류가 담겨있으며 Payload는 서버에서 첨부한 사용자 권한정보와 데이터가 담겨있다. Signature에는 Header와 Payload를 base64 URL-safe Encode 한 이후 Header에 명시된 해시함수를 적용하고, Private Key로 서명한 전자서명이 담겨있다. 전자 서명 알고리즘으로 타원 곡선 암호화(ECDSA)를 사용한다고 가정하면,

Sig = ECDSA(SHA256(B64(Header).B64(Payload)),Private Key)

이를 JWT로 표현하면 다음과같이 되는데 위에서 만든 전자서명도 base64 URL-safe Encode 처리해 합쳐줄 필요가 있다. 위 전자서명은 Header와 Payload가 변조되었는지 확인하기 위해 사용되는 중요 정보이며 JWT를 신뢰할 수 있는 토큰으로 사용할 수 있는 근거가 된다.

JWT = B64(Header).B(64)Payload.B64(Sig)

전자서명에는 비대칭 암호화 알고리즘을 사용하므로 암호화를 위한 키와 복호화를 위한 키가 다르다. 암호화에는 개인키, 복호화에는 공용키를 사용한다.


JWT를 어떻게 구현하는가? 에 대해선 https://pronist.dev/143 링크를 참고

profile
Backend 개발자가 되어보자!!

0개의 댓글

관련 채용 정보