개발 일지/Spring

[Spring Security] JWT

미숫가루설탕많이 2023. 3. 20. 14:17

 JWT(JSON Web Token)는 데이터를 안전하고 간결하게 전송하기 위해 고안된 JSON 기반의 웹 표준 인증 방식이다. 인증과 권한 부여를 위해 사용되며, URL과 HTTP 통신을 사용하는 웹 애플리케이션에서 사용된다.

 

 

 

 

JWT 구조

 

// Header.Payload.Signature
xxxx.yyyyyy.zzzz

 

 JWT는 Header, Payload, Signature로 이루어져 있다. Header에는 토큰의 타입 및 해싱 알고리즘 정보, Payload에는 서버와 클라이언트 간에 교환할 정보(사용자의 정보), Signature는 Secret Key를 이용하여 Header와 Payload의 내용이 변경되지 않았는지 확인할 수 있는 값이 담겨 있다.

 

 각 부분은 Base64로 인코딩 되어 하나의 문자열로 구성된다.

 

 Payload에는 서버에서 활용할 수 있는 사용자의 정보가 담겨 있으며, Signature를 통해 유효성이 검증될 정보이긴 하지만 손쉽게 디코딩이 가능하므로 민감한 정보는 포함하지 않는 것이 좋다.

 

 Signature에서는 Secret Key와 Header에서 지정한 알고리즘을 사용하여 Header와 Payload에 대해 단방향 암호화를 수행한다.

 

 

 

 

JWT 종류

 

 JWT는 보통 Access Token과 Refresh Token을 사용자의 자격 증명에 이용한다.

 

 Access Token은 인증된 사용자가 특정 서비스에 접근하기 위해 필요한 권한 증명서로 사용된다. 사용자가 로그인하면 인증 서버는 사용자를 인증하고, 유효한 사용자인 경우 Access Token을 발급한다. 이 토큰은 서비스 API에 요청을 보낼 때마다 헤더에 포함되어 서버에서 유효성을 검사하고 권한이 있는지 확인하여 요청을 처리한다.

 

 AccessToken은 일반적으로 짧은 유효기간을 주어 보안상의 이점을 가져갈 수 있지만, 유효기간이 짧기 때문에 액세스 토큰을 자주 발급해야 한다는 단점이 있다.

 

 Refresh Token은 AccessToken의 유효기간이 만료되었을 때 새로운 Access Token을 발급하는 데 사용된다. 만약 Access Token이 만료된 상태에서 API 요청을 보내면 서버는 Access Token이 만료되었다는 응답을 보내고, 클라이언트는 새로운 Access Token을 발급받기 위해 Refresh Token을 사용한다.

 

 

 

 

JWT 장단점

 

 장점

  • JWT는 서버 측에서 상태를 관리할 필요 없이 클라이언트가 토큰을 가지고 있기 때문에 서버 부하를 줄일 수 있다는 큰 장점이 있다. 따라서, 상태를 유지하지 않고(Stateless) 확장에 용이한(Scalable) 애플리케이션을 구현하기 용이하다.
  • 클라이언트가 인증하는 모든 API 요청에서 JWT를 사용할 수 있어서 개발자가 인증 관련 코드를 반복해서 작성할 필요가 없다.
  • 사용자의 자격 증명 정보를 직접 관리하지 않고 Github, Google 등 다른 플랫폼의 자격 증명 정보로 인증하는 것이 가능하다.
  • 토큰의 Payload 안에 해당 사용자의 권한 정보를 포함하는 것이 용이하다.

 

 

 

 단점

  • JWT는 한 번 발급되면 만료시간이 지나기 전까지는 계속 사용될 수 있기 때문에, 해커에게 탈취당하면 계속 유효하게 사용될 가능성이 있다.
  • JWT의 Payload는 Base64로 인코딩 되어 있어 암호화가 되어있지 않으므로 디코딩하면 토큰 생성 시 저장한 데이터를 확인할 수 있다.
  • 토큰에 저장하는 정보의 양이 많아질수록 네트워크에 부하를 줄 수 있다.