JWT
JWT는 유저를 인증하고 식벽하기 위한 인증 방식이다. 토큰은 세션과는 달리 서버가 아닌 클라이언트에 저장되기 때문에 메모리나 스토리지 등을 통해 세션을 관리했던 서버의 부담을 덜 수 있다. JWT가 가진 핵심적인 특징이 있다면, 토큰 자체에 사용자의 권한 정보나 서비스를 사용하기 위한 개인 정보가 포함이 되어 있다는 것(Self-Contained)이다.사용자가 가져야하는 데이터가 많아지면 당연히 토큰이 가지고 있어야하는 양도 커져야 하며, 한 번 토큰을 발급한 후 사용자 정보가 바뀌더라도 새로운 토큰을 발급하지 않으면 서비스를 사용하지 못하게 되어있다. JWT를 사용하면 무상태(Stateless)인 환경에서 사용자 데이터를 주고 받을 수 있게된다. 세션(session)을 사용하게 될 경우에는 쿠키를 통해 식별하고 서버에 세션을 저장했지만 JWT는 클라이언트에 정보를 저장하고 요청시 단순히 HTTP헤더에 토큰을 첨부하는 것만으로 데이터를 요청하고 응답을 받을 수 있다.
JWT 사용 흐름
- 클라이언트가 웹사이트에 로그인.
- 서버에서 서명된 JWT를 생성하여 클라이언트에게 응답으로 돌려줌.
- 클라이언트가 서버에 데이터를 추가적으로 요구할 때 JWT를 HTTP Header에 첨부.
- 서버에서는 클라이언트로부터 온 JWT 검증.
JWT는 JSON 데이터를 Base64 URL-safe Encode 를 통해 인코딩하여 직렬화한 것이 포함됨. 토큰 내부에는 위변조 방지를 위해 개인키를 통한 전자서명도 있음.
Base64 URL-safe Encode는 일반적인 Base64 Encode에서 URL에서 오류없이 사용하도록 "+" 와 "/" 를 "-" 와 "_" 로 표현한 것.
JWT 의 구조
JWT의 구조는 총 3개로 Header, Paylod, Signature 로 나뉘어져 있다.
1. Header
header에는 보통 토큰의 타입이나, 서명 생성에 어떤 알고리즘이 사용되었는지 저장함. 지금 같은 경우에는 현재 토큰의 타입이 JWT이고 , 개인키로는 HS512 알고리즘으로 적요되어 암화가 되었다고 표시하고 있음.
2. Payload
payload는 보통 Claim 이라는 사용자에 대한, 혹은 토큰에 대한 property를 key-value의 형태로 저장한 것이다. 그러한 key 값에 대한 표준 스펙이 존재하는데 아래와 같다.
- iss(issuer): 토큰 발급자
- sub(subject): 토큰 제목 - 토큰에서 사용자에 대한 식별 값이 됨.
- auc(Audience): 토큰 대상자
- exp(Expiration Time): 토큰 만료날짜
- nbf(nor Before): 토큰 활성 날짜(이 날짜 이전의 토큰은 활성화 되지 않음을 보장)
- iat(Issued At): 토큰 발급 시간
- jti(JWT id): JWT토큰 식별자 (issuer가 여러명일때 이를 구분하기 위함.)
여기서 중요한 것은 payload에 민감한 정보를 담지 않아야 한다는 것이다. 위에 header와 payload는 json이 디코딩되어있을 뿐이지 특별한 암호화가 걸려있는 것이 아니기 때문이다.
2. Signature
해당 영역에는 header와 payload 그리고 서버가 가지고 있는 개인키가 합쳐진 값이다. 여기에 있는 개인키는 최초 토큰이 생성이 될 때의 값으로 클라이언트가 가지고 있다가 서버에 재접속시에 서버는 토큰을 받아 복호화 하여 그 개인키가 자신이 들고 있는 것과 같은지 비교한다.
'Backend > Security' 카테고리의 다른 글
UsernamePasswordAuthenticationFilter (0) | 2023.01.03 |
---|---|
Boot Security (0) | 2023.01.02 |
CIA, RSA, RFC (1) | 2022.12.29 |
OSI 7계층과 TCP(전송 제어 프로토콜) (0) | 2022.12.29 |
Session(세션)과 Cookie(쿠키) (0) | 2022.12.29 |