코이팅

JWT(Json Web Token)란? 본문

CS

JWT(Json Web Token)란?

코이팅 2023. 1. 14. 03:29
728x90
반응형

1. JWT(Json Web Token)란?

JWT는 Json Web Token의 약자로 일반적으로 클라이언트와 서버 사이에서 통신할 때 권한을 위해 사용하는 토큰입니다. JWT는 웹표준(RFC 7519)으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 방식으로 정보를 안전성 있게 전달해줍니다. 웹 상에서 정보를 Json 형태로 주고 받기 위해 표준규약에 따라 생성한 암호화된 토큰으로 복잡하고 읽을 수 없는 String 형태로 저장되어 있습니다.

 

**[토큰 기반 인증방식]

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

 

2. JWT(Json Web Token)의 특징

  • JWT는 인증에 필요한 정보들을 JSON 토큰으로 암호화 시킨 것이기 때문에 토큰 자체에 모든 정보를 지니고 있습니다.
  • JWT는 세션 기반 인증과 주로 대비됩니다. 세션 사용시 문제점이었던 stateful한 특성을 JWT 사용시 stateless(무상태)하게 가져갈 수 있습니다.
  • 토큰으로 상태를 관리하기 때문에 따로 세션을 둘 필요가 없습니다.
  • 하지만 토큰도 탈취당할 수 있기 때문에 토큰 관리를 해야합니다.
  • 클레임 토큰 기반입니다.

**[stateful]

클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 보존함을 의미합니다.

 

**[stateless]

무상태를 뜻합니다. 상태를 유지하지 않습니다. 이전에 요청한 정보에 대해서 서버는 알 수 없습니다.

 

**[일반 토큰 기반 vs 클레임 토큰 기반]

일반 토큰 기반 인증은 토큰을 검증할 때 필요한 관련 정보들을 서버에 저장해두고 있었기 때문에 항상 DB에 접근해야만 했습니다. session 방식 또한 저장소에 저장해두었던 session ID를 찾아와서 검증하는 절차입니다.

 

클레임 토큰 기반인 JWT는 사용자 인증에 필요한 모든 정보를 토큰 자체에 담고 있기 때문에 별도의 저장소가 필요 없습니다. 분산 마이크로서비스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증을 제공하여 일반 토큰 기반 인증에 비해 편리합니다.

 

3. JWT(Json Web Token)의 구성요소

JWT는 헤더(header), 페이로드(payload), 서명(signature) 세 파트로 나누어져 있습니다.

[헤더(header)]

어떠한 알고리즘으로 암호화 할 것인지, 어떠한 토큰을 사용할 것인지에 대한 정보가 들어있습니다.

 

[정보(payload)]

전달하려는 정보(사용자 id나 다른 데이터들👉🏻= 클레임)가 들어있습니다. payload에 있는 내용은 수정이 가능하기때문에 더 많은 정보를 추가할 수 있습니다. 그러나 노출과 수정이 가능한 지점이기 때문에 인증이 필요한 최소한의 정보(아이디, 비밀번호 등 개인정보가 아닌 이 토큰을 가졌을 때 권한의 범위나 토큰의 발급일과 만료일자 등)만을 담아야 합니다.

 

[서명(signature)]

가장 중요한 부분으로 헤더와 정보를 합친 후 발급해주는 서버가 지정한 'Secret Key'로 암호화 시켜 토큰을 변조하기 어렵게 만들어줍니다.

 

예를 들어 토큰이 발급된 후 Payload의 정보를 수정하면 Payload에는 누군가 조작한 정보가 들어가 있지만 Signature에는 수정되 전의 Payload 내용을 기반으로 이미 암호화 되어있는 결과가 저장되어 있기 때문에 조작되어있는 Payload와는 다른 결과값이 나오게 됩니다.

 

3. JWT(Json Web Token)의 동작원리

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