어떤 방법이 더 좋다기 보다는 장단점을 기억해주는 것이 좋다. 과거의 Monolithic 서버에서는 session cookie를 많이 이용했었고 scale out 상태에서의 로드벨런싱을 처리하기 위해 REDIS 서버를 사용했었다. 최근의 REST 방식의 서비스들은 MSA(Micro Service Architecture) 기반으로 많이 작성하기도 하고여러 서버를 활용하는 일이 많아지기도 했고 REDIS의 활용도 네트워크 부담이 되기 때문에 그냥 서버에서 토큰만 점검하면 되는 JWT를 많이 이용하는 추세다.
마지막으로 정리하면 토큰은 무상태이며 확장성이 좋다. 애초에 HTTP의 특성이 무상태인데 여기에 적합하며 무상태이기 때문에 서버의 확장에 전혀 부담이 없다.
JWT
JWT란?
JWT(Json Web Token)은 RTC7519에 선언된 개방형 업계 표준으로 두 당사자 간에 클레임(데이터)를 안전하게 표현하기 위해 사용된다. JSON 기반이기 때문에 대부분의 언어, 플랫폼에 독립적으로 사용할 수 있는 장점도 있다.
JWT는 Header, Payload, Signature 3개의 부분으로 구성된 토큰으로 각 부분은 .로 연결된다.
Header: 일반적으로 토큰의 유형(typ)와 사용중인 서명 알고리즘(alg)으로 구성된다. Header는 Base64로 인코딩되어 토큰의 첫 번째 부분을 구성한다.
Payload: 토큰의 두번째 부분은 Payload인데 여기는 통상 클레임(claim)이 담긴다. 클레임은 일반적으로 사용자 정보에 해당하는 엔티티와 추가 데이터에 대한 내용으로 registed, public, private 3종류가 있다. Payload도 Base64로 인코딩된어 전달된다.
registed: name(토큰 이름), exp(만료시간), sub(대상), iss(발행자) 등 필수 사항은 아니지만 미리 정의된 권장사항이다. JWT는 간결해야 하므로 클레임 이름은 3글자만 사용한다.
public: JWT를 사용하는 사람들이 마음대로 정의할 수 있는 내용이다. 외부에 공개되어도 괜찮은 정보들이며 이름 충돌을 방지하기 위해 URI 형식을 취한다.
private: 사용에 동의한 당사자 간에 정보를 공유하기 위해 만든 클래임으로 서비스 내부적으로 사용하는 커스텀 데이터를 담는다.
서명된 토큰의 경우 정보의 위/변조는 막을 수는 있지만 누구나 읽을 수 있다. 따라서 페이로드 또는 헤더에 비밀 정보를 넣으면 안된다.