JWT는 JSON Web Token의 약자로, 서버와 클라이언트 간 사용자를 인증하고 식별하기 위한 토큰 기반 인증 방식을 말한다.
JSON 형식(Key/Value)의 표준 규격에 따라 생성 ・ 암호화되어 복잡하고 읽기 어려운 String 형태로 저장된다.
구분자 .
로 구분되며, 헤더(header), 페이로드(payload), 서명(signature) 세파트로 구성되어 있다.
어떤 알고리즘으로 암호화(alg) 할지, 어떤 토큰 타입을(typ) 사용할 지에 대한 정보가 들어있다.
{
"typ" : "JWT",
"alg" : "HS256"
}
❗️ 정리
- 헤더 (Header) : 토큰 유형과 해시 알고리즘 종류
- 정보 (Payload) : 사용자의 인증/인가 정보
- 서명 (Signature) : 헤더와 페이로드를 비밀키로 암호화
JWT(Access token)만을 사용한 인증 방식은 몇가지 문제점이 존재한다.
1. 토큰의 유효기간이 짧다면 사용자가 자주 로그인을 해야 하기때문에 번거롭고, 토큰을 통해 사용자 권한을 인증하므로
2. 토큰의 유효기간이 길다면, 제 3자에게 토큰을 탈취당할 경우 보안에 취약하다.
👉 이런 문제점을 보완하기 위해 Access token & Refresh token를 통한 인증 과정을 사용한다.
Access token과 Refresh token은 모두 JWT로 Access token은 접근에 관여하는 토큰, Refresh token은 재발급에 관여하는 토큰의 역할을 한다.
JWT는 토큰 자체에 사용자 정보가 저장 되어 있어 서버는 토큰 검증만을 통해 사용자 임을 확인할 수 있다.
또한 사용자가 늘어나도 사용자 인증에 대한 서버의 부담을 줄일 수 있다.
단순히 HTTP 헤더에 Access Token을 담아 보내면, 손쉽게 요청하고 응답을 받을 수 있다.
JWT는 상태를 저장하지 않기 때문에 한번 생성되면 삭제가 불가능하다. 따라서 토큰이 만료되기 전 제 3자에게 탈취될 경우, 심각한 보안상 문제가 발생할 수 있어 반드시 만료 시간을 넣어주어야 한다.
Claim이 많아질주록 JWT토큰이 길어진다.
때문에 데이터 요청 시 요청헤더에 담아 보내는 Access Token의 길이가 길어질수록 요청 및 응답이 늦어지는 등 네트워크에 부담이 된다.
Payload 정보는 암호화되지 않고 인코딩만 하기 때문에, Payload가 탈취되어 디코딩하면 모든 정보에 접근가능하다.
따라서 Payload에는 ID, PW와 같은 중요 데이터를 담지 않아야한다.
📂 출처