토큰이란 ? (토큰 기반 인증 VS 서버 기반 인증)
구글 로그인 API를 구현해보려고 여러 블로그에서 정보를 찾다가 "토큰"이라는 말이 눈에 밟혔다. 생각해보니 이전에 세션과 쿠키에 대해 정리한 적은 있는데 토큰은 처음 듣는 말이었다. 그래서
gwamssoju.tistory.com
이전 포스팅에서 서버 기반 인증과 토큰 기반 인증에 대해 알아보았다.
그래서 이번 포스팅에서는 토큰 기반 인증에 쓰이는 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] 📚 JWT(Json Web Token )란? 💯 이해하기 쉽게 정리
Cookie & Session JWT 토큰을 배우기 앞서 쿠키와 세션에 대한 개념이 있으면, 토큰이 왜 사용이 되는지 ..등 보다 명확히 이해가 될수 있을 것이다. JWT를 배우기 앞서 우선 쿠키와 세션의 통신 방식을
inpa.tistory.com
JWT.IO
JSON Web Tokens are an open, industry standard RFC 7519 method for representing claims securely between two parties.
jwt.io
'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 |