기본 정보
JSON Web Token (JWT) 은 웹표준 (RFC 7519) 으로서 두 개체에서 JSON 객체를 사용하여 가볍고 자가수용적인 (self-contained) 방식으로 정보를 안전성 있게 전달해줍니다.
라고 설명이 나와있다. 여기서 중요한건
self-contained
JWT는 이런식으로 구성되어 자체적으로 토큰에 정보를 담고있다.
그래서 전달이 쉽다.
웹서버의 경우 HTTP의 헤더에 넣어서 전달 할 수도 있고, URL 의 파라미터로 전달 할 수도 있다.
헤더
{
"typ": "JWT",
"alg": "HS256"
}
이런식으로 타입은 JWT
alg 는 알고리즘으로 보통 HMAC SHA256 혹은 RSA 가 사용된다.
내용
JWT의 표준 스펙
1. iss (Issuer) : 토큰 발급자
2. sub (Subject) : 토큰 제목 - 토큰에서 사용자에 대한 식별 값이 됨
3. aud (Audience) : 토큰 대상자
4. exp (Expiration Time) : 토큰 만료 시간
5. nbf (Not Before) : 토큰 활성 날짜 (이 날짜 이전의 토큰은 활성화되지 않음을 보장)
6. iat (Issued At) : 토큰 발급 시간
7. jti (JWT Id) : JWT 토큰 식별자 (issuer가 여러 명일 때 이를 구분하기 위한 값)
물론 다른 내용을 넣어도 가능하다!!
토큰 내용은 base64로 인코딩 되기 때문에 탈취되었을때 내용을 쉽게 들여다 볼수있어서
민감한 내용은 넣지 않아야 한다.
서명
JSON Web Token 의 마지막 부분은 바로 서명(signature) 입니다. 이 서명은 헤더의 인코딩값과, 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성한다.
JWT 토큰을 클라이언트가 서버로 요청과 동시에 전달한다.
서버가 가지고 있는 개인키를 가지고 Signature를 복호화한 다음 base64UrlEncode(header)가 JWT의 heaer값과 일치한 지, base64UrlEncode(payload) 와 일치한 지 확인하여 일치한다면 인증을 허용합니다.
위에는 jwt.io를 가지고 만들어본 토큰이다!
장 단점
장점:
무상태성: 서버가 클라이언트의 상태를 저장하지 않으므로, 서버의 확장성과 성능이 향상됩니다. 이는 특히 마이크로서비스 아키텍처에 유리합니다.
자체 포함: JWT는 필요한 모든 정보를 자체적으로 포함하고 있어, 별도의 데이터베이스 조회 없이 토큰만으로 인증과 권한 부여를 처리할 수 있습니다.
다양한 클라이언트 지원: 웹, 모바일, 데스크톱 등 다양한 클라이언트에서 쉽게 사용할 수 있습니다.
보안: 서명된 토큰을 사용하여 변조를 방지할 수 있습니다. 비대칭 키를 사용하여 더 높은 보안 수준을 구현할 수 있습니다.
확장성: API 게이트웨이 및 마이크로서비스와 잘 통합되며, 중앙 집중식 인증 서버 없이도 각각의 서비스가 인증을 수행할 수 있습니다.
단점:
탈취 위험: 토큰이 유출되면 만료될 때까지는 이를 막을 방법이 없습니다. 이를 방지하기 위해 토큰을 짧은 유효 기간으로 설정하고, 주기적으로 갱신하는 방식이 필요합니다.
토큰 크기: JWT는 자체적으로 많은 정보를 포함하고 있기 때문에 세션 쿠키보다 크기가 클 수 있습니다. 이는 네트워크 대역폭에 영향을 줄 수 있습니다.
무효화 어려움: JWT는 무상태이므로, 발행된 토큰을 서버에서 무효화하는 것이 어렵습니다. 블랙리스트를 관리하거나, 중요한 정보가 변경될 때 토큰을 강제로 만료시키는 방법이 필요합니다.
복잡성: 올바르게 구현하려면 JWT의 구조와 보안 문제를 잘 이해해야 합니다. 특히, 서명 및 암호화 방법을 잘못 사용할 경우 보안 취약점이 생길 수 있습니다.
쉽게 이야기하면 stateless라는 특징과 데이터베이스를 거치지 않아
여러개의 서버에서도 인증이 가능하여 간편하게 사용할수있다.
하지만 탈취시 방법이 없다 같은 토큰이면 무조건 허용시키기 때문에 탈취되면 어쩔수없다.
(물론 토큰을 block시키면 되지만 탈취되었는지 알수가 없으면 어쩔수없다!)
특히 시크릿키 같은경우 쉽게만들면 취약점이 생길수있다.!!
'혼자공부한거' 카테고리의 다른 글
[스프링부트] 스프링부트 CRUD deleteMapping 사용하기 (0) | 2021.08.11 |
---|