[SpringSecurity+JWT] JWT란?

해니·2023년 11월 9일
0

SpringBoot

목록 보기
2/24
post-thumbnail

JWT(Json Web Token) 개념

  • 웹에서 사용되는 JSON 형식의 토큰에 대한 표준 규격
  • 클레임(Claim) 토큰 기반 인증
  • 사용자의 인증(authentication) 또는 인가(authorization) 정보를 서버와 클라이언트 간에 안전하게 주고 받기 위해서 사용된다.
  • 웹에서 보통 Authorization HTTP 헤더를 Bearer <토큰>의 형태로 설정하여 클라이언트에서 서버로 전송되며, 서버에서는 토큰에 포함되어 있는 서명(signature) 정보를 통해서 위변조 여부를 빠르게 검증할 수 있다.




JWT 구조


헤더(header)

  • 어떠한 알고리즘으로 암호화 할 것인지, 어떠한 토큰을 사용할 것 인지에 대한 정보

정보 (Payload)

  • 전달하려는 정보(사용자 id나 다른 데이터들, 이것들을 클레임이라고 부른다)가 포함된다.
    • 토큰에 담기는 정보의 한 조각을 클레임(claim)이라 하며 name:value 로 이루어져 있다.
  • payload에 있는 내용은 수정이 가능하여 더 많은 정보를 추가할 수 있다.
    • 노출과 수정이 가능한 지점이기 때문에, 인증이 필요한 최소한의 정보(아이디, 비밀번호 등 개인정보가 아닌 이 토큰을 가졌을 때 권한의 범위나 토큰의 발급일과 만료일자 등)만을 담아야한다.

서명 (Signature)

  • 헤더와 정보를 합친 후 발급해준 서버가 지정한 secret key로 암호화 시켜 토큰을 변조하기 어렵게 만들어준다.

토큰이 발급된 후 누군가가 Payload의 정보를 수정하면 Payload에는 다른 누군가가 조작된 정보가 들어가 있지만 Signatute에는 수정되기 전의 Payload 내용을 기반으로 이미 암호화 되어있는 결과가 저장되어 있기 때문에 조작되어있는 Payload와는 다른 결과값이 나오게 된다. 이러한 방식으로 비교하면 서버는 토큰이 조작되었는지 아닌지를 쉽게 알 수 있고, 다른 누군가는 조작된 토큰을 악용하기가 어려워진다👍







JWT 동작 원리

  1. 사용자가 id와 password를 입력하여 로그인 요청을 한다.
  2. 서버는 회원DB에 존재하는 사용자인지 확인을 한다.
  3. 확인이 되면 서버는 로그인 요청 확인 후, secret key를 통해 토큰을 발급한다.
  4. 이것을 클라이언트에 전달한다.
  5. 서비스 요청과 권한을 확인하기 위해서 헤더에 데이터(JWT) 요청을 한다.
  6. 데이터를 확인하고 JWT에서 사용자 정보를 확인한다.
  7. 클라이언트 요청에 대한 응답과 요청한 데이터를 전달해준다.

토큰 기반 인증방식은 사용자의 인증이 완료된 이후에 토큰을 발급한다.
클라이언트쪽에서는 전달받은 토큰을 저장해두고 서버에 요청을 할 때마다 해당 토큰을 서버에 함께 전달한다.
그 이후 서버는 토큰을 검증하고 응답하는 방식으로 작동한다.




일반 토큰 기반 vs 클레임 토큰 기반

일반 토큰 기반 인증

  • 토큰을 검증할 때 필요한 관련 정보들을 서버에 저장해두고 있었기 때문에 항상 DB에 접근해야 한다.
  • session방식 또한 저장소에 저장해두었던 session ID를 찾아와 검증하는 절차를 가져 다소 번거롭다.

클레임 토큰 기반 인증

  • 사용자 인증에 필요한 모든 정보를 토큰 자체에 담고 있기 때문에 별도의 인증 저장소가 필요하지 않다.
  • MSA(분산 마이크로 서비스 아키텍처) 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증을 제공하여 일반 토큰 기반 인증에 비해 편리하다고 할 수 있다.




출처
JWT - Json Web Token
JWT란 무엇인가?

profile
💻 ⚾️ 🐻

0개의 댓글