helloworld
JWT 구조 이해 본문
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
이 사이트를 보면 JWT에 대한 설명을 확인 할 수 있다.
JWT는 보안을 제공하긴 하지만 요점은 누가보냈나?에 중점을 둔 기술?이다
JWT의 구조는 header/payload/signature 라고 한다.
xxxxx.yyyyy.zzzzz 라고 표현한다.
헤더에는 알고리즘은 뭐로 사용했는지, 타입이 뭔지 나타나있다.
{ "alg": "HS256", "typ": "JWT" }
페이로드는 어떠한 정보 부분이다. 이 정보는 클레임을 가지고 있다. 클레임은 등록 된 클레임과 개인 클레임으로 이루어지 는데 등록 된 클레임은 필수 조건은 아니지만 권장되는 클레임 집합니다. 그 내용에는 발행자, 만료시간, 주제, 청중 등이다.
개인 클레임엔 유저아이디같은 것을 넣는다고 한다. 공개되도 상관 없지만 그 유저인지 특정 할 수 있는 PK를 개인클레임에 넣을 예정이라고 한다.
{ "sub": "1234567890", "name": "John Doe", "admin": true }
sub나 name은 등록된 클레임인 것 같고 admin은 개인이 원하면 만들어 낼 수 있는 키 밸류값일 것이라고 한다.
header에는 어떤 알고리즘으로 암호화했는지를 넣고
payload에는 어떠한 정보들을 담는다.
signature에는 header와 payload, 나만 알고 있는 개인키를 넣는다.

id 와 pw 로 로그인 요청을 하면 서버는 서버만 알고 있는 key값을 이용하여 jwt 토큰을 만든후 클라이언트에 보낸다.
이후 클라이언트는 로컬스토리지라는 영역에 들고 있다가 서버에게 '내 정보 좀 줘' 하면서 jwt 토큰을 같이 보낸다.
서버는 토큰이 유효한 토큰인지 확인 해야한다. 만약 클라이언트에서 보낸 토큰이 12345 라고 했을때 서버는 그 토큰을 복호하고 하는 것이 아니라 서버만 가지고 있는 key를 이용하여 다시 암호화를 해본다. 유효한 토큰이라면 12345가 똑같이 나올 것이다. 그러면 payload에 있는 id값을 이용하여 쿼리문을 날리고 다시 클라이언트에 정보를 보내준다.
만약 RSA 암호방식을 사용하고 싶다면
header에 RSA를 넣고
payload에 username : woo
signiture ---- 개인키 (header + payload)
시그니쳐에 secret키를 넣는 것이 아닌 header와 payload를 개인키로 묶어 보낸다.
다시 클라이언트에서 서버로 요청이 왔을 때에는 공개키로 열어서 확인만 하면 인증이 가능하다.
설명만 들었을 때에는 RSA가 더 간편해 보이긴 하는데 HS256방식을 더 많이 선호한다고 한다.
'jwt' 카테고리의 다른 글
| jwt 임시 토큰 만들어보기 (2) | 2023.10.19 |
|---|---|
| JWT 를 위한 Security 설정 (0) | 2023.10.19 |
| RFC 문서 (0) | 2023.10.18 |
| RSA (2) | 2023.10.10 |
| CIA (1) | 2023.10.10 |