JWT(JSON Web Token) 개념

Benjamin·2022년 9월 15일
0

CS

목록 보기
3/10

JWT?

유저를 인증하고 식별하기 위한 토큰기반 인증
토큰은 세션과 달리 서버가 아닌 클라이언트에 저장 : 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다.
토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 정보가 포함된다.
데이터가 많아지면 토큰이 커질 수 있고, 토큰이 한 번 발급된 이후 사용자의 정보를바꾸더라도 토큰을 재발급하지 않는 이상 반영되지 않는다.

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

진행 순서

  1. 사용자가 id와 password를 입력하여 로그인을 시도합니다.
  2. 서버는 요청을 확인하고 secret key를 통해 Access token을 발급합니다.
  3. JWT 토큰을 클라이언트에 전달 합니다.
  4. 클라이언트에서 API 을 요청할때 클라이언트가 Authorization header에 Access token을 담아서 보냅니다.
  5. 서버는 JWT Signature를 체크하고 Payload로부터 사용자 정보를 확인해 데이터를 반환합니다.
  6. 클라이언트의 로그인 정보를 서버 메모리에 저장하지 않기 때문에 토큰기반 인증 메커니즘을 제공합니다.
    인증이 필요한 경로에 접근할 때 서버 측은 Authorization 헤더에 유효한 JWT 또는 존재하는지 확인한다.
    JWT에는 필요한 모든 정보를 토큰에 포함하기 때문에 데이터베이스과 같은 서버와의 커뮤니케이션 오버 헤드를 최소화 할 수 있습니다.
    일반적으로 JWT 토큰 기반의 인증 시스템은 위와 같은 프로세스로 이루어집니다.
    처음 사용자를 등록할 때 Access token과 Refresh token이 모두 발급되어야 합니다.

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

구조

Header, Payload, Signature로 구성되며, 각 요소는 '.'으로 구분된다.

  • Header : JWT에서 사용할 타입과 해시알고리즘의 종류
  • Payload : 서버에서 첨부한 사용자 권한 정보와 데이터
  • Signature : Header,Payload를 Base64 URL-safe Encode를 한 이후 header에 명시된 해시함수를 적용하고, 개인키로 서명한 전자서명이 담겨있다.

전자서명 알고리즘으로 타원곡선암호화(ECDSA)를 사용한다고 가정하면,
Sig = ECDSA(SHA256(B64(Header).B64(Payload)),PrivateKey)

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

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

참고사이트
https://m.blog.naver.com/shino1025/221568544633
http://www.opennaru.com/opennaru-blog/jwt-json-web-token/

0개의 댓글