Jwt 구조 및 생성
JWT
1. JWT란
- JWT(Json Web Token)
- 이름에서 알 수 있는 Json으로 된 Token
- 토큰 자체가 의미를 갖는 Claim 기반 토큰 방식
- Claim(권한) : 사용자에 대한 프로퍼티나 속성 의미
2. JWT 특징
- 정보가 담긴 데이터(JSON 객체)를 암호화 하여, HTTP 헤더에 추가 시킨다.=> 보안성 증가
- 권한을 부여하기 위한 필요 데이터가 JWT 안에 모두 담겨 있다.
하지만 JWT가 보안에 완벽한 것은 아니다. 누군가가 토큰을 탈취한다면, 그 토큰을 이용하여 권한을 수행할 수 있다. 그래서 토큰을 서버에 저장하는 것이 아니기 떄문에 토큰에 유효시간을 설정해야 하며, 탈취 될 가능성을 줄이기 위해 유효시간을 짧게 해 주는것이 좋다.
- JWT 데이터 무결성 - HMAC
- 토큰이 탈취 당하더라도 위변조의 위험을 벗어날 수 있도록 무결성을 보장하고자 하는 방법
- 데이터를 암호화하고, 해싱하는 HMAC 기법을 사용
- 토큰을 탈취하여 데이터를 수정하게 되면 해싱의 결과가 완전히 달라지게되어 토큰이 위조 되었음을 알 수 있게 된다.
- 원본 메세지에서 해쉬값을 추출한 후, 이를 비밀 키를 이용하여 복호화 시켜 토큰의 뒤에 붙인다.
3. JWT 구조
1. 헤더(header)
헤더에는 typ과 alg 속성을 명시한다.
- typ
- 토큰의 타입 명시
- alg
- 해싱 알고리즘 명시
- 이 알고리즘은 서버에서 토큰을 검증할 때 signature에서 사용한다.
2. 내용(payload)
내용에는 토큰에 대한 정보를 작성한다.
정보는 속성, 값으로 표현되며 이를 claim이라 한다.
- registered claim
- 미리 정의된 claim으로써, 토큰에 대한 정보를 작성한다.
- 토큰에 대한 정보를 담기 위함
- iss : 토큰 발급자
- exp : 토큰 만료 시간
- sub : 토큰 제목
- aud : 토큰 대상자
- public claim
- 공개적인 claim 명시
- private claim
- 서버와 클라이언트가 협의한 claim을 명시
3. 서명(Signature)
서명에는 헤더, 내용의 인코딩값을 "."으로 연결하여 합친 후 비밀키로 해싱한다.
4. JWT 장점과 단점
장점
- 별도의 인증 저장소가 필요 없다.
- 분산 마이크로 서비스 환경에서 중앙 집중식 인증 서버와 데이터베이스에 의존하지 않는 쉬운 인증 및 안가 방법을 제공하다.
- 디버깅 및 관리가 용이
- 트래픽에 대한 부담이 낮음
- Rest 서비스로 제공 가능
- 수평 스케일 유리
단점
- 토큰은 클라이언트에 저장되어 사용자 정보를 조작하더라도 토큰에 직접 적용할 수 없다.
- 더 많은 필드가 추가되면 토큰의 크기가 커진다.
출처