1. JWT를 왜 써야하는가?
- 기존의 Web Session 방식의 단점
- 다른 도메인간에 공유될 수 없다.
- 서버의 확장성이 낮다.
- JWT의 장점
- 세션에 비해 별도의 저장소가 필요 없다. 즉, 확장성이 높다.
- 다른 도메인간에 공유될 수 있다.
- JWT의 단점
2.JWT의 구성 요소
- 구성 : (Header).(payload).(signature)
- Header (헤더):
typ
와 alg
를 키로 가지고 있음
{
"typ" : "JWT", // 토큰의 타입 지정
"alg" : "HS256" // 해싱 알고리짐 지정. RSA혹은 SHA256 사용
}
- payload (정보): 토큰에 담을 정보. 정보의 한
조각
을 Claim(클레임)
이라고 부르고 이는 JSON 형태의 key : value 형식으로 이루어져 있음.
- 클레임의 종류 : registered, public, private
- Registered claim (등록된 클레임): 토큰에 대한 정보들을 감기 위해 이미 이름이 정해진 클레임들. 이 클레임들의 사용은 Optional이며, 클레임이름들은 다음과 같다.
- iss: 토큰 발급자 (issuer)
- sub: 토큰 제목 (subject)
- aud: 토큰 대상자 (audience)
- exp: 토큰의 만료 시간 (expiration). NumbericDate 형식으로 되어있어야 한다. 또한 현재 시간보다 이후로 설정되어있어야한다.
- nbf : Not Before를 의미. 토큰의 활성 날짜. Numberic Date 형식으로 날짜를 지정하고, 이 날짜가 지나기 전까지는 토큰이 처리되지 않음.
- iat : 토큰이 발급된 시간 (issued at). 이 값을 사용하여 토큰의 age가 얼마나 되었는지 판단.
- jti : JWT의 고유 식별자. 주로 중복적인 처리를 방지하기 위해 사용.
- public Claim (공개 클레임): 공개 클레임들은 충돌이 방지된 이름을 가지고있어야 하며, 이를 위해 클레임 이름을 URI 형식으로 짓ㅅ는다.
- private Claim (비공개 클레임): 클라이언트, 서버 상호 협의하에 사용되는 클레임. 공개 클레임과는 달리 이름이 중복되어 충돌될 수 있으니 사용에 유의.
- payload 예제 출처 (https://velopert.com/2389)
{
"iss": "velopert.com",
"exp": "1485270000000",
"https://velopert.com/jwt_claims/is_admin": true,
"userId": "11028373727102",
"username": "velopert"
}
- Signature (서명) : 헤더와 정보의 인코딩 값 (base64)를 합친 후 비밀키로 해시화 하여 사용.