HTTP 요청에는 이전 상태들에 대한 정보가 없다.(Stateless 하다.)
하지만 서버에서는 이 요청을 보낸 사용자가 로그인된 사용자인지 등을 포함한 여러 상태 정보를 관리하고 싶어한다. 이런 필요성으로 나온 개념이 세션(Session)과 쿠키(Cookie)이다.
Session / Cookie
사용자가 웹에 접속하여 로그인을 한다고 할 때 다음과 같이 세션과 쿠키를 활용할 수 있다.
- 사용자가 웹에 접속하여 ID/PW를 입력하고 로그인 요청을 보낸다.
- 서버에서는 ID/PW를 검증 후 통과하면 로그인된 사용자의 정보(세션)을 생성하고 이를 DB 등에 저장한다.
- 서버는 저장된 세션을 조회하기 위한 Key(쿠키)를 HTTP 헤더에 담아 사용자에게 전달한다.
- 사용자의 이후 요청은 쿠키값를 포함하며, 서버에서는 쿠키를 이용해 세션을 조회하여 활용한다.
세션을 탈취하는 공격에 대해서 HTTPS를 사용하거나 세션에 유효시간을 부여하는 등의 처리를 한다고 해도, 사용자가 점점 늘어난다면 그에따라 저장해야할 세션들이 늘어나므로 확장성을 생각하면 비효율적이다.
JWT
세션/쿠키 방식을 보완하며 등장한 것이 JWT 인증방식이다.
JWT는 Claim 기반의 방식으로 세션/쿠키 방식에서 세션으로 서버에 저장되어야 할 정보를 JSON형식의 토큰에 저장하여 클라이언트에게 전달한다. JSON 형태를 그대로 전달하는 것은 아니고 BASE64로 인코딩 후 전달하는데 비밀키로 복호화 과정을 거치기 때문에 안정성을 더한다.
서버에서는 JWT을 사용자에게 발급 후 별도의 정보저장 없이 다음 사용자 요청에 같이 전송된 JWT을 복호화/파싱 후 로그인 여부나, 권한 등을 알 수 있다.
컨셉정도로만 정리하고 JWT가 어떻게 구성되어 있는지, 어떻게 생성할지 등은 아래 블로그를 참고하자.