JWT
JWT란?
RFC 7519 웹 표준으로 JSON
을 이용하여 토큰 자체의 정보를 저장하고 있는 Web Token
이다. JSON Web Token의 앞글자를 따서 JWT라고 부른다.
일반적으로 사용자 인증에 사용되며 클라이언트가 JWT를 서버에 전송하면 서버에서 유효한 토큰인지 검증하고 작업을 수행한다.
구성
.을 기준으로 header
, payload
, signature
을 나눈다.
XXXXXXX.YYYYYYYY.ZZZZZZZZZ
header payload signature
Header
Signature를 해싱하기 위한 알고리즘 정보
{
"alg": JWT를 서명하는데 쓰인 알고리즘,
"typ": 토큰 타입(기본적으로 jwt)
}
Payload
클라이언트와 서버가 주고 받는 실제 정보
{
"iss": 토큰 발행자 ,
"exp": 만료 시간 ,
"sub": 제목 ,
"iat": 토큰 발행 시간 ,
"jti": JWT ID ,
등등...
}
- Registed claims: 미리 정의된 claims
- iss, exp, sub, iat, jti…
- Public claims: 사용자가 정의할 수 있는 클레임으로 공개용 정보 전달을 위해 사용. 충돌 방지를 위해 클레임 이름을 URI로 지정
- Private claims: 해당하는 당사자들 간에 정보를 공유하기 위해 만들어진 사용자 지정 클레임. 외부에 공개되도 상관없지만 해당 유저를 특정할 수 있는 정보들
claims: key-value로 이루어진 한 쌍의 정보
Signature
토큰을 인코딩 하거나 유효성 검증을 할 때 사용하는 고유한 암호 코드로 Header와 Payload의 값을 Base64로 인코딩 후 인코딩한 값을 비밀키를 이용해 헤더에서 정의한 알고리즘 해싱을 하고 다시 Base64로 인코딩하여 생성
HMACSHA512(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-512-bit-secret
)
장단점
- 장점
- 중앙의 인증 서버, 데이터 스토어에 대한 의존성이 없어 시스템 수평 확장에 유리
- Base64Url Safe Endcoding 사용으로 url, cookie, header 모두 사용 가능
- 단점
- Payload에 정보가 많아지면 트래픽 증가
- Token이 클라이언트에 저장되기 때문에 서버에서 조작 불가능
- Payload를 탈취해서 디코딩하면 누구나 내용을 볼 수 있기 때문에 중요한 정보는 담지 말아야한다.
동작 방식
- 클라이언트에서 아이디와 비밀번호 입력 후 로그인 요청
- 서버에서 DB에 저장 되어있는 아이디와 비밀번호가 일치하는지 확인
- 일치하면 토큰을 생성해 클라이언트로 응답
- 클라이언트는 요청시 HTTP 헤더에 토큰을 담아서 요청
- 서버에서 토큰의 유효성을 검증하고 유효하면 요청에 관한 로직 처리