json 형태의 데이터를 안전하게 교환하여 사용할 수 있게 해주는 인터넷 표준으로서 자리잡은 규격으로 여러가지 암호화 알고리즘을 사용할 수 있다.
header.payload.signature 의 형식으로 3가지의 데이터를 포함한다. (항상 2개의 ' . ' 이 포함됨)
1) header(머리)는 signature(배)에서 어떤 암호화를 사용하여 생성된 데이터인지 표현합니다.
2) payload(가슴)는 개발자가 원하는 데이터를 저장합니다.
3) signature(배)는 이 토큰이 변조되지 않은 정상적인 토큰인지 확인할 수 있게 도와줍니다.
비밀 키를 모르더라도 복호화가 가능해(변조는 x) 누구나 복호화 하여 볼 수 있으므로 민감한 정보를 담으면 안됨.
쿠키, 세션은 데이터를 교환하고 관리하는 방식인데 반해 JWS는 단순히 데이터를 표현하는 방식이다.
데이터를 브라우저로 보내도 쿠키처럼 자동 저장되지는 않으나, 변조가 거의 불가능하며 서버에 데이터를 저장하지 않는 이유로 서버를 stateless(무상태) 상태로 관리할 수 있어 최근에 많이 쓰이는 기술중 하나
-> Node.js 서버가 언제든 죽었다 살아나도 똑같은 동작을 하면 Stateless하다 표현, 반대로 로그인 정보 등의 데이터를 서버에 저장하게 되면 무조건 stateful 상태!
사용하는 라이브러리 -> npm: jsonwebtoken
보통 암호화 된 데이터는 클라이언트(브라우저)가 전달받아 다양한 수단(쿠키, 로컬스토리지 등)을 통해 저장하여 API 서버에 요청을 할 때 서버가 요구하는 HTTP 인증 양식에 맞게 보내주어 인증을 시도한다.
-> 물론 이런 단점을 보완하기 위해 현업에서는 Access Token, Refresh Token 이렇게 이중으로 나누어 인증하는 방식을 취한다.
-> Access Token은 접근에 관여, Refresh Token은 재발급에 관여하는 역할의 JWT 이라고 말할 수 있다.