Json 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token
- Claim: 토큰에서 사용할 정보의 조각
- https://jwt.io/ 에서 JWT 토큰을 인코딩/디코딩 할 수 있다.
- 토큰 자체를 정보로 사용하는 Self-Contained 방식
- 회원 인증, 정보 전달에 사용됨
로그인시 토큰 처리 과정
- HTTP 요청
- static 변수에 저장
- 요청을 보낼 때마다 로컬 스토리지에서 계속 JWT를 불러오면 오버헤드가 발생한다.
- 로그아웃
- 로컬 스트로지에 저장된 JWT 제거한다.
- blacklist라는 db table에 토큰을 추가하여 해당 토큰의 접근을 막는다.
구성
.
구분자를 사용하여 3부분으로 나누어주며, 각 부분은 json을 Base64URL로 인코딩하여 표현된다.
: Algorithm & Token Type
- alg: Signature를 hashing하기 위한 알고리즘 방식
- typ: token type
2. Payload
: Data
-
Registered Claim (등록된 클레임)
- 토큰 정보를 표현하기 위해 이미 정해진 종류의 데이터
- key는 모두 길이 3의 String
- 선택적으로 작성 가능 (사용 권장)
- 종류
- iss: 토큰 발급자 (issuer)
- sub: 토큰 제목 (subject), unique 값 사용 (주로 사용자 이메일)
- aud: 토큰 대상자 (audience)
- exp: 토큰 만료 시간 (expiration), NumericDate 형식 (ex> 1480849147370)
- nbf: 토큰 활성 날짜 (not before)
- iat: 토큰 발급 시간(issued at), 토큰 발급 이후의 경과 시간
- jti: JWT 토큰 식별자 (jwt id), 중복 방지, 일회용 토큰(access token) 등에 사용
-
Public Claim (공개 클레임)
- Private Claim (비공개 클레임)
- 사용자 정의 클레임
- 서버와 클라이언트 사이에 임의로 지정한 정보
- 예시
{
"name": "John Doe"
}
3. Signature
- 토큰을 인코딩하거나 유효성 검증을 할 때 사용하는 고유한 암호화 코드
- 서명 만드는 방법
- 헤더와 페이로드의 값을 각각 Base64URL로 인코딩
- 인코딩한 값을 비밀키를 이용해 헤더에서 정의한 알고리즘으로 해싱
- 다시 Base64URL로 인코딩
장점
- 인증에 필요한 모든 정보를 토큰 자체가 포함하기 때문에 별도의 인증 저장소가 필요 없다.
- 쿠키를 전달하지 않아도 되므로 쿠키를 사용해서 발생하는 취약점이 사라진다.
- REST 서비스로 제공 가능하다.
- URL 파라미터와 헤더로 사용된다.
단점
- Self-Contained
- 토큰 자체가 정보를 담고 있어서 양날의 검이 될 수 있다.
- 토큰 길이
- 정보가 많아질수록 토큰의 길이가 늘어나고 네트워크에 부하를 줄 수 있다.
- Payload Encoding
- 페이로드는 Base64URL로 인코딩만 되고 암호화되지 않았기 때문에 탈취되면 제 3자가 데이터를 디코딩하여 볼 수 있다.
- JWE(Json Web Encryption)로 암호화하거나 중요 데이터를 넣지 말아야 한다.
- Stateless
- 상태를 저장하지 않기 때문에 한 번 만들어지만 제어가 불가능하다.
- 임의 삭제가 불가능하기 때문에 토큰 만료 시간을 반드시 넣어주어야 한다.
출처