[Network] JWT란

2022. 9. 30. 20:23TIL💡/Network

저번에 공부했는데, 안 써보니까 또 까먹어서 다시 정리해본다!

 

- JWT = JSON Web Token

- 두 개체에서 JSON 객체를 사용하여 가볍고 자가 수용적인 (self-contained) 방식으로 정보를 안전성있게 전달해준다.

- 수많은 프로그래밍 언어에서 지원된다.

- 자가 수용적이다.

즉 필요한 모든 정보를 자체적으로 지녀 독립적이다. JWT 시스템에서 발급된 토큰은 토큰에 대한 기본 정보와 전달할 정보(ex. 로그인 시스템에서는 유저 정보) 그리고 토큰이 검증됐다는 것을 증명해주는 signature를 포함한다.

- 쉽게 전달될 수 있다.

JWT는 자가수용적이므로 두 개체 사이에서 손쉽게 전달될 수 있다.

웹서버의 경우 HTTP의 헤더에 넣어서 전달할 수 있고, URL의 파라미터로 전달할 수도 있다.

 

사용되는 경우

회원 인증

- JWT를 사용하는 가장 흔한 시나리오다.

- 유저가 로그인을 하면 서버는 유저의 정보에 기반한 토큰을 발급하여 유저에게 전달한다 (서버 → 유저)

- 그 후 유저가 서버에 요청을 할 때마다 JWT를 포함하여 전달한다.

- 서버는 클라이언트에게서 요청을 받을 때마다 해당 토큰의 유효성을 검토하고

- 유저가 요청한 작업에 권한이 있는지를 확인하여 작업을 처리합니다.

- 또한 서버 측에서는 유저의 세션을 유지할 필요가 없다.

- 즉 유저가 로그인되어있는지 신경 쓸 필요가 없고, 요청 시 토큰만 확인하면 되니 세션 관리가 필요 없으니 서버 자원을 많이 아낄 수 있다.

 

정보교류

- JWT는 두 개체 사이에서 안정성있게 정보를 교환하기에 좋은 방법이다.

- 그 이유는 정보가 sign이 되어있기 때문에 정보를 보낸 이가 바뀌지는 않았는지 또 정보가 도중에 조작되지 않았는지 검증할 수 있다.

헤더

- type: 토큰의 타입

- alg: 해싱 알고리즘

 

내용

- 토큰에 담을 정보

- 여기에 담는 정보의 한 조각을 클레임(claim)이라 부르고, name/value의 한 쌍으로 이뤄져있다.

- 토큰에는 여러 클레임을 넣을 수 있다.

클레임의 종류

1. Registered claim - 등록된 클레임들은 서비스에서 필요한 정보들이 아닌 토큰에 대한 정보를 담기 위하여 이미 정해진 클레임들

ex) 토큰 발급자, 토큰 제목, 토큰 대상자, 토큰의 만료 시간, 토큰의 활성 시작 날짜, 토큰 발급 날짜, 토큰 고유 식별자(중복 처리 방지)

2. Public claim - 충돌 방지된 이름을 가져야 함. 충돌방지를 위해 클레임 이름을 URI 형식으로 짓는다.

{
    "https://goodgid.github.io/jwt_claims/is_admin": true
}

3. Private claim - 양 측간에 협의하에 사용되는 클레임 이름들, 이름이 중복되어 충돌할 수 있으니 주의해야 한다.

 

서명

- JSON Web Token의 마지막 부분은 바로 서명(signature)이다.

- 이 서명은 헤더의 인코딩값과 정보의 인코딩값을 합친 후 주어진 비밀키로 해시를 하여 생성한다.

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

이렇게 만든 해시를 base64형태로 나타내면 된다.

문자열을 인코딩하는 게 아니라 hex to base64 인코딩해야 한다.

 

참고

https://goodgid.github.io/JWT/

 

JWT 소개 및 구조

Index

goodgid.github.io

 

'TIL💡 > Network' 카테고리의 다른 글

[HTTP] HTTP 진화 과정  (0) 2022.10.26
[HTTP] HTTP 개념 정리 💡  (0) 2022.10.26
[암호화] TLS(Transport Layer Security)  (0) 2022.09.30
[암호화] SSL의 지원하는 기술  (0) 2022.09.30
[암호화] 두 가지 암호화 기술  (0) 2022.09.30