[Spring] JWT 토큰이란 무엇일까?

2024. 1. 31. 14:32Spring

 

JWT (JSON WEB TOKEN) 이란 

 

JSON 웹 토큰은 선택적 서명 및 선택적 암호화를 사용하여 데이터를 만들기 위한 인터넷 표준으로, 페이로드는 몇몇 클레임 표명을 처리하는 JSON을 보관하고 있다. 토큰은 비공개 시크릿 키 또는 공개/비공개 키를 사용하여 서명된다. 

 

간단히 말하자면 인증에 필요한 정보들을 암호화시킨 JSON 토큰을 말하는 것이다. 그리고 이러한 JWT을 이용해 서버와 클라이언트는 사용자가 누구인지 식별한다. 

 

JWT 프로세스

 

  1. 사용자 로그인 진행
  2. 사용자 확인 
  3. Access Token 발급
  4. 응답으로 Access Token 저장
  5. 데이터 요청 시 Header Access Token 전송
  6. Access Token 검증 실행

 

JWT 3가지 구조
  • 헤더(Header) : 토큰 타입과 해싱 알고리즘이 담겨있다. 
  • 페이로드(Payload) : 토큰에 담을 클레임을 포함한다. 클레임은 토큰 사용자에 대한 속성이나 추가 데이터를 나타내며, 등록된 클레임, 공개 클레임, 비공개 클레임 세 가지 종류가 있다. 쉽게 말해 서버에서 첨부한 사용자의 권한 및 기타 데이터들이 담겨있다는 것을 말한다. 
    • sub : 토큰 제목(subject)
    • aud : 토큰 대상자(audience)
    • iat : 토큰이 발급된 시각 (issued at)
    • exp : 토큰의 만료 시각 (expired)
  • 서명(Signature) : Header, Payload를 서명하는 데 사용한다. 서명이란 서버의 비밀키를 이용해 토큰의 무결성과 인증을 보장하는 데 사용한다.
    • Base64URL(Header) + Base64URL(PayLoad) + secret key or server key 같은 키를 이용해 암호화를 진행한다.
    • 여기서 중요한 것은 서명을 통한 토큰을 무결성과 인증을 보장하는 것인데 우리는 일반적으로 서명을 통한 암호화를 진행한다면 토큰의 데이터가 뭐가 들었는지 알 수 없다. 하지만 비밀키가 노출되거나 너무 짧을 경우 복호화를 통해 사용자 정보와 권한을 탈취할 수 있다. 비밀키를 이용해 암호화를 진행했으니 해당 키가 없다면 아무도 JWT만 가지고 복호화를 진행할 수 없다.

 

 

JWT 복호화를  통한 토큰 구조 파악하기

 

해당 사이트는 JWT 토큰 인코딩, 디코딩과 구조 파악을 할 수 있는 사이트이다.

 

https://jwt.io/

 

JWT.IO

JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.

jwt.io

 

JWT의 사용
  • 인증 : 사용자가 로그인하면 서버는 사용자의 정보를 기반으로 JWT를 생성하여 반환합니다. 이후 사용자는 이 토큰을 이용하여 서버에 요청을 보낼 때마다 자신을 인증할 수 있습니다.
  • 정보 교환 : JWT는 두 당사자 사이에서 안전하게 정보를 교환하기 위한 수단으로 사용될 수 있습니다. 정보는 서명되어 있으므로, 정보가 조작되었는지 여부를 검증할 수 있습니다.

 

JWT의 장점
  • 자가 포함(Self-contained) : JWT는 필요한 모든 정보를 자체적으로 가지고 있습니다. 따라서 토큰 하나로 사용자 인증 및 정보 전달이 가능합니다.
  • 분산된 환경에서의 활용성 : 서버간의 통신이나 여러 도메인 간의 인증에서 유용하게 사용됩니다.
  • 효율성 및 확장성이 보장된다 : 세션을 서버에 저장할 필요 없이 클라이언트가 토큰을 관리해 서버의 리소스를 절약할 수 있다.
    EX) 기존 세션방식의 경우 사용자가 로그인을 하면 서버는 해당 정보를 DB에 저장을 하고 클라이언트는 어떠한 요청을 보낼 때마다 해당 세션 번호를 서버에 전송하고 서버는 세션 번호를 DB에서 탐색해 인증을 진행한다. 사용자가 적은 서비스일 경우 해당 방식에서 큰 리소스 부담이 없지만 사용자가 늘어날 수 록 DB의 크기가 커지고 탐색 시간도 늘어날 것이다. 하지만 JWT의 경우 사용자의 권한과 정보가 다 들어있고 서버는 그중 유효기간 확인만 하면 된다.

 

JWT의 단점
  • 토큰 크기 : Payload에 너무 많은 정보를 담을 경우 토큰의 크기가 커져 네트워크 지연을 초래할 수 있다.
  • 보안 문제 : 토큰이 탈취되면, 유효 기간이 만료될 때까지 사용될 수 있습니다. 따라서 보안에 주의를 기울여야 한다.
  • 토큰 관리 : 토큰을 발급하면 이후에는 클라이언트에서 관리하고 저장하기 때문에 토큰의 탈취 여부를 서버에서 알기 어려워지는 문제가 발생한다.
  • Payload 복호화 : payload의 경우 위에서 처럼 암호화가 아닌 Base64로 인코딩 된 것이기 때문에 탈취 후 쉽게 디코딩을 통해 내부 정보를 볼 수 있다. 때문에 민감정보 (주민번호, 전화번호..) 데이터는 넣지 않아야 한다 

 

다음에는 Spring에서 Token을 생성하는 방법을 알아보자