이전 포스팅에서 서버 기반 인증과 토큰 기반 인증에 대해 알아보았다.
그래서 이번 포스팅에서는 토큰 기반 인증에 쓰이는 JWT에 대해 알아보려고 한다 !
JWT란 ?
인증에 필요한 정보를 암호화시킨 토큰을 의미한다.
요청할 때, JWT를 HTTP 헤더에 포함시켜서 서버가 클라이언트를 식별하는 방식이다.
JWT는 언제 사용할까?
- 권한 부여 : 사용자가 로그인하면 각 후속 요청에 JWT가 포함되어 해당 토큰으로 허용되는 서비스, 리소스에 접근할 수 있다. SSO(Single-Sign-On)은 오버헤드도 적고 여러 도메인에서 쓸 수 있기 때문에 JWT를 많이 사용하는 이유이다.
- 정보 교환 : JWT는 안전하게 정보를 주고 받기 좋은 방법이다. header와 payload를 사용하여 signature를 생성하기 때문에 내용이 변조되지 않았는지 확인할 수 있다.
JWT의 구조
JWT의 구조는 세 부분으로 나뉜다.
- Header
- Payload
- Signature
1) Header( xxxxx )
토큰의 유형과 알고리즘 형식으로 구성된다.
alg : 서명 확인 알고리즘 ( HMAC SHA256 , RSA 등 )
typ : 토큰 유형
2) Payload( yyyyy )
토큰에서 사용할 정보의 조각인 Claim이 담겨있다.
즉, 서버와 클라이언트가 주고받는 시스템에서 실제로 사용될 정보를 담고 있다.
Payload는 Registered claims, Public claims, Private claims로 분류할 수 있다.
한 쌍의 키와 값으로 구성된 정보를 클레임이라고 한다.
▶ Registered claims : 필수는 아니지만 권장되는 클레임.
- iss (issuer) : 발행자
- exp (expiration time) : 만료 시간
- sub (subject) : 제목
- aud (audience) : 발행 시간
- others
▶ Public claims : 사용자가 마음대로 정의할 수 있는 클레임. 공개용 정보 전달을 위해 사용.
▶ Private claims : 당사자간에 정보를 공유하기 위해 생성된 클레임.
3) Signature( zzzzz )
Signature를 생성하기 위해 인코딩된 헤더와 인코딩된 페이로드 그리고 헤더에 지정된 알고리즘이 있어야 한다.
즉, Signature는 (Header + Payload)와 서버가 갖고 있는 유일한 Key 값을 합친 것을 Header에 정의한 알고리즘으로 암호화한다.
만약 HMAC SHA256 알고리즘을 사용한다면, 아래와 같다.
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret )
Signature는 내용이 도중에 변경되지 않았는지 확인하는 데 사용되며 JWT를 보낸 사람이 누구인지 확인하는데 사용할 수 있다.
WHY ? 신뢰할 수 있을까 ?
User1은 A + B + C 라는 JWT이 있다고 가정하자.
User2가 User1의 JWT를 A + B' + C로 수정하고 요청을 보냈다면 서버에서는 JWT가 변조된 것을 알 수 있을까?
위에서 말했듯이 C(Signature)는 A(Header)와 B(Payload)로 구성된다.
그러면 User2가 B → B'로 수정했으면 당연히 C의 값이 변할 것이다.
서버는 변조된 A + B' + C와 검증 후 새로 만든 A + B' + C'가 일치하지 않음을 통해 JWT가 변조된 것을 알 수 있다.
즉, 서버는 클라이언트로 부터 받은 JWT에서 Header와 Payload로 Signature를 다시 만들고 이를 비교하여 인증을 통과시키는 것이다.
▼ 도움을 주신 분들
'Web' 카테고리의 다른 글
HTTP와 HTTPS의 차이가 뭐지? (0) | 2022.07.06 |
---|---|
Proxy란 ? (0) | 2022.06.20 |
토큰이란 ? (토큰 기반 인증 VS 서버 기반 인증) (0) | 2022.06.15 |
REST란? REST API 와 RESTful API (0) | 2022.06.13 |
캐시(Cache) (0) | 2022.05.23 |