JSON Web Token 의 약자로 인증 및 권한 부여를 위한 인터넷 표준이다.
안전한 방식으로 정보를 전송하기 위해서 디지털 서명을 사용하는 JSON 형식의 데이터이다.
JWT는 Header, Payload, Signature의 3 부분으로 이루어지며, Json 형태인 각 부분은 Base64Url로 인코딩 되어 표현된다.
또한 각각의 부분을 이어 주기 위해 .구분자를 사용하여 구분한다.
추가로 Base64Url는 암호화된 문자열이 아니고, 같은 문자열에 대해 항상 같은 인코딩 문자열을 반환한다.
헤더는 typ, alg 두가지 정보로 구성된다. alg 는 Signature를 해싱하기 위한 알고리즘을 지정하는 것이다.
typ : 토큰의 타입을 지정함 : jwt
alg : 알고리즘 방식을 지정하며, 서명 및 토큰 검증에 사용한다.
JWT 토큰의 페이로드에는 토큰에서 사용할 정보의 조각들인 클레임이 담겨있다
클레임은 총 3 가지로 나누어져있고, Json(Key/value) 형태로 다수의 정보를 넣을 수 있다.
Signatre 은 토큰을 인코딩하거나 유효성 검증할 떄 사용하는 고유한 암호화 코드이다.
위에 헤어(header) 페이로드(payLoad) 의 값을 Base64url 로 인코딩하고, 인코딩한 값 + Signature (비밀 키)를 이용해 헤더에서 정의한 알고리즘으로 해싱을하고
, 이 값을 다시 BASE64URL 로 인코딩하여 생성한다.
클라이언트와 서버관계에서 서버가 클라이언트 상태를 보존함을 의미한다.
클라이언트와 서버 간에 송수신을 하며 단계별 과정을 진행하는데 있어, 서버에서 클라이언트가 이전 단계에서 제공한 값을 저장하고 다음 단계에서도 저장한 상태이다.
로그인에 빗대어 보자면, 로그인 성공시 상태를 서버가 세션 메모리에 저장되어 상태를 유지하는 것이다. 과거 에는 Stateful 상태를 많이 사용을 하였지만 근래에는 웹을 사용하는 사람이 급격히 많아져 트래픽이 많이 발생할 시, 서버에서 몇 만명의 로그인 정보를 세션 메모리에 저장하면서 클라이언트에서 요청 한 정보를 받아들이기엔 서버에 큰 부담을 안겨주게 된다..
이래서 새로운 기법 Stateless 가 탄생하게 된다..
클라이언트와 서버 관계에서 서버가 클라이언트의 상태를 보존하지 않는다.
예를들어 로그인에 성공 시, 사용자가 상세 페이지로 접속을 했을 때에 로그인 상태가 유지가 되어야한다. 이 상태를 서버에서 보존하지 않는 것이다.
Stateless 구조에서는 서버는 단순히 클라이언트에서 요청이 오면 응답을 보내는 역할만 수행하는 것이며 로그인을 유지 하는 것은 클라이언트에게 책임을 지게 하는 것이다!
Stateless 의 특징으로 클라이언트와 서버간의 통신에 필요한 모든 상태 정보를 클라이언트에서 가지고 있다가 서버와 통신할 때 데이를 실어보낸다.
그래서 서버는 단순히 받아서 응답만 해주기 때문에 서버에 대한 부하가 현저히 줄어든다.
하지만 클라이언트에서는 로그인 상태를 유지를 해야하는데 이 Statless 의 특징을 유지하면서 탄생한 기술이 바로 JWT 토큰이다.
토큰은 클라이언트가 암호화된 로그인 정보들을 지니고 있다가 서버에 통신할 때마다 넘겨줌으로써 내가 로그인 됬음을 인증하는 방식이다