728x90

JWT란?

JSON 정보를 안전하게 전송하기위한 방식. HMAC, RSA 또는 ECDSA를 사용

1.구조 : Header.PayLoad.Signature(서명)


1.1 Header는 typ(토큰의 타입), alg(알고리즘 방식)으로 구성
여기서 alg는 서명을 해싱하기 위한 알고리즘이다.

1.2 PayLoad는 여러 정보들 (쉽게 유저 정보 정도)

1.3 서명은 Header와 PayLoad 그리고 시크릿키를 가지고 암호화 (HS256은 시크릿키를 포함하지만 RSA는 헤더와 페이로드를 개인키로 암호화 한다.)

  • Header, PayLoad, 서명은 각각 base64로 암호화 되어있다. -> 디코딩 또한 가능 (해시는 디코딩 불가능)
  • 이 원리를 통해 암호화에 목적이 있는 것이 아닌 서명에 목적을 두며 데이터가 유효한지 검증하기 위한 작업을 할 수 있다고 한다.

2. 작동 방식

 

1. 클라이언트에서 서버로 로그인 시도를 하면 서버에서 JWT 토큰을 만들어 되돌려 준다.
2. 클라이언트는 보통 이 토큰을 로컬스토리지에서 가지고 있는다.
3. 클라이언트에서 서버에 개인정보를 요청하면서 JWT 토큰을 서버에 전달한다.
4. 서버에서 토큰을 검증하여 클라이언트에서 요청을 보낸 사용자가 신뢰할 수 있는 사용자인지 검증한다.

5. 요청 받은 정보를 페이로드를 통해 DB에서 일치하는 정보를 찾아 리턴한다. 

  • 검증하는 방법 : 클라이언트에서 전달 받은 JWT 토큰과 비교한다.
  • 무엇을 비교해? : 서버에서 Header와 PayLoad, 시크릿키 등을 암호화 해보고 결과가 전달받은 JWT 토큰과 똑같은지 검증한다.

HMAC? : 서명을 Header와 PayLoad, 시크릿키를 이용해서 암호화

 

RSA?

  • Header.PayLoad.서명
  • 서명 : (헤더+페이로드)를 개인키로 암호화
  • 위에 기술된 내용은 HMAC을 예로 기술한 내용이며, 서명이 (헤더, 페이로드, 시크릿키)로 구성 됐다는 차이뿐이다.
  • RSA 검증 시 : 클라이언트가 서버에 요청하면 공개키로 서명을 검증하기만 하면 됨.

 

-

 

 

* 해당 글은 인프런에 게시된 '최주호'님의 강의를 듣고 개인적으로 정리한 글입니다.

강의 출처 : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

+ Recent posts