토큰
회사에서 통합로그인을 개발중이다.
통합로그인을 하기 위해서 많이들 사용하는 jwt 토큰방식을 이용할 것이다.

jwt
jwt
란 JSON Web Token
을 말한다.
- JSON 포맷을 이용한 Web Token
- Claim based Token
- 두 개체에서 JSON 객체를 이용해 Self-contained
- 방식으로 정보를 안전한게 전달
- 회원 인증, 정보 전달에 주로 사용
- RFC 7519
claim based token에서 Claim
은 사용자에 대한 프로퍼티 / 속성을 말한다.
토큰 자체가 사용자에 대한 정보가 된다.
jwt의 기본구조
각각 JSON 형태의 데이터를 base 64 인코딩 후 합친다.
Header . Payload . Signature 와 같은 순서로 . 을 이용해 합친다.
최종적으로 만들어진 토큰은 HTTP 통신 간 이용되며, Authorization 이라는 key의 value로서 사용된다.

JWT 웹 토큰의 헤더 정보
- typ : 토큰의 타입, JWT만 존재
- alg : 해싱 알고리즘. (HMAC SHA256 or RSA). 헤더를 암호화 하는게 아니다. 토큰 검증시 사용.
{
"alg" : "HS256",
"typ" : "JWT"
}
Payload
실제 토큰으로 사용하려는 데이터가 담기는 부분. 각 데이터를 Claim이라고 하며 다음과 같이 3가지 종류가 있다.
Reserved claims : 이미 예약된 Claim. 필수는 아니지만 사용하길 권장. key 는 모두 3자리 String이다.
- iss (String) : issuer,
- 토큰 발행자 정보exp (Number) : expiration time,
- 만료일sub (String) : subject,
- 제목aud (String) : audience,
- More
Public claims : 사용자 정의 Claim.
- Public 이라는 이름처럼 공개용 정보
- 충돌 방지를 위해 URI 포맷을 이용해 저장한다.
Private claims : 사용자 정의 Claim
- Public claims 과 다르게 사용자가 임의로 정한 정보
- 아래와 같이 일반 정보를 저장한다.
{
"name" : "hak",
"age" : 26,
}
Signature
Header와 Payload의 데이터 무결성과 변조 방지를 위한 서명
Header + Payload 를 합친 후, Secret 키와 함께 Header의 해싱 알고리즘으로 인코딩
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT 의 단점 & 도입시 고려사항
Self-contained : 토큰 자체에 정보가 있다는 사실은 양날의 검이 될수 있다.
토큰 길이 : 토큰 자체 payload 에 Claim set을 저장하기 때문에 정보가 많아질수록 토큰의 길이가 늘어나 네트워크에 부하를 줄 수 있다.
payload 암호화 : payload 자체는 암호화 되지 않고 base64로 인코딩한 데이터다. 중간에 payload를 탈취하면 디코딩을 통해 테이터를 볼 수 있다. JWE 를 통해 암호하하거나, payload에 중요 데이터를 넣지 않아야 한다.
Stateless : 무상태성이 때론 불편할 수 있다. 토큰은 한번 만들면 서버에서 제어가 불가능하다. 토큰을 임의로 삭제할 수 있는 방법이 없기 때문에 토큰 만료시간을 꼭 넣어주는게 좋다.
tore Token : 토큰은 클라이언트 side에서 관리해야하기 때문에 토큰을 저장해야한다.
다음에는 spring boot에서 토큰을 이용한 로그인 방식을 알아보자.


출처
이상학의 개발블로그:티스토리
JWT 인증 예제