Stateful, Stateless Server
- State Serve
: 클라이언트에게 요청 받을 때, 클라이언트 상태(쿠키 혹은 세션)를 저장하고 있다가 유용한 정보로 활용 - Stateless Server
: 클라이언트의 이전 상태(쿠키 혹은 세션)을 기록하지 않고, 서버는 클라이언트의 요청만으로 작업을 처리
Stateless 방식의 서버에서 토큰을 사용하는 이유
- 확장성
: 세션을 이용하여 클라이언트의 요청을 처리한다면, 많은 트래픽이 발생했을 때 서버에 부담을 줄 수 있습니다. 하지만 토큰을 사용한다면, 어떤 서버로 요청이 들어와도 문제가 발생하지 않으므로 확장성이 생김 - 보안성
: 클라이언트가 서버에 요청을 보낼 때 쿠키나 세션을 이용한 방식의 취약점을 보완할 수 있음
⇒ 위와 같은 이유에 덧붙여, http 프로토콜의 결함을 어느정도 보완하는 해결책으로 JWT 가 제시됩니다.
JWT(Json Web Token)
- JWT(JSON Web Token)는 당사자 간에 정보를 JSON 개체로 안전하게 전송하기 위한 간결하고 자체 포함된 방법을 정의 하는 개방형 표준( RFC 7519 )입니다.
- JWT는 비밀( HMAC 알고리즘 사용)을 사용 하거나 RSA 또는 ECDSA를 사용하는 공개/개인 키 쌍을 사용하여 서명할 수 있습니다 .
- JSON 개체로 만들어진 정보는 디지털 서명되어, 신뢰할 수 있습니다.
JWT 는 언제 사용해야 할까
- 권한부여
: 사용자가 로그인할 때 각 후속 요청에는 JWT가 포함되어 사용자가 해당 토큰으로 허용되는 경로, 서비스 및 리소스에 액세스할 수 있습니다. - 정보교환
: JSON 웹 토큰은 공개/ 개인 키 쌍을 사용하여 JWT에 서명할 수 있기 때문에 당사자 간에 정보를 안전하게 전달할 수 있습니다. 또한 헤더와 페이로드를 사용하여 서명을 계산하므로 콘텐츠가 변조되지 않았는지 확인할 수도 있습니다.
JWT 구조
헤더(HEADER) - ALGORITHM & TOKEN TYPE
- typ: 토큰의 타입 지정 - JWT
- alg: 해싱 알고리즘 지정. 보통 HMAC SHA256 혹은 RSA가 일반적으로 사용된다.
- 헤더의 JSON은 최종적으로 Base64 URL 로 인코딩된다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
정보(PAYLOAD) - DATA
- payload 은 클레임을 포함하고 있습니다.
- 클레임은 클라이언트에 대한 정보나 추가 데이터에 대한 설명을 담고 있습니다.
(* claim: 토큰에 담을 정보의 한 조각)
클레임
- 등록된 클레임
: 서비스에서 필요한 정보들이 아닌, 토큰에 대한 정보를 담기 위해 이름이 정해진 클레임 (iss, exp, sub, aud 등이 있음)
https://datatracker.ietf.org/doc/html/rfc7519#section-4.1
- 공개 클레임
: JWT 사용자들이 마음대로 정의할 수 있으나, 충돌을 방지하기 위해 IANA JSON 웹 토큰 레지스트리에 정의하거나 충돌 방지 네임스페이스를 포함하는 URI로 정의해야 합니다. - 비공개 클레임
: 등록, 공개된 클레임이 아닌 클라이언트와 서버의 협의하에 정보를 공유하기 위해 생성된 클레임입니다. 공개클레임과 다르게 중복된 이름으로 인한 충돌이 생길 수 있습니다.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
서명된 토큰의 경우 정보들은 보호되지만 누구나 읽을 수 있습니다. 암호화 되지 않은 경우 JWT의 정보나 헤더 요소에 공개되면 안되는 정보를 넣지 않아야합니다.
서명(SIGNATURE)
- 헤더의 인코딩 값과 정보의 인코딩 값을 합친 후 주어진 비밀키로 해쉬를 하여 생성합니다.
- HMAC SHA256 알고리즘을 사용한 경우, 다음과 같은 방식으로 서명이 생성됩니다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
1. 헤더와 정보의 인코딩 값 사이에 "." 을 넣어 합친다.
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ
2. 위 값을 비밀키로 해싱을 하고 base64 로 인코딩
3. 서명 생성
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
서명은 메세지가 도중에 변경되지 않았는지 확인하는 데 사용되며 개인 키로 서명된 토큰의 경우 JWT를 보낸 사람이 누구인지도 확인할 수 있습니다.
참고사이트
반응형
'⚡ 기타 > 참고' 카테고리의 다른 글
로드 밸런싱이란? (0) | 2022.01.12 |
---|---|
Public Key Retrieval is not allowed, dbeaver mysql 접속 오류 (0) | 2022.01.04 |
xcode - undefined symbol: protocol descriptor for Swift.ExpressibleByFloatLiteral 에러 (0) | 2022.01.04 |
지도 API 사용에 필요한 좌표 얻기 (0) | 2022.01.03 |
JWT 정리 2 - JWT 사용 시 고려해야 할 사항 (0) | 2022.01.02 |