Session 과 Cookie 인증 방식은 클라이언트의 세션 저장소를 요구하며 로그인시 사용자 정보를 저장하고 Key로 사용되는 세션 ID를 생성한다. 사용은 HTTP Header에 세션 ID가 포함된 Cookie와 함께 클라이언트에 전송하는 방식으로 클라이언트는 이를 세션 저장소에서 비교하여 인증이 완료되면 Request에 따라 응답을 수행한다.
쿠키는 세션 저장소에 담긴 유저 정보를 얻기 위한 열쇠이지만 만일의 HTTP 요청 도중에 Cookie 가 노출되더라도 쿠키에 포함된 세션 ID는 의미없는 값으로 본다. 때문에 초기 인증방식의 계정정보 인증 방식 보다는 안전하다고 본다.
모든 사용자가 서로다른 Session ID를 발급받게 되며 클라이언트는 별도의 사용자 조회 없이도 Session ID를 통해 사용자 정보를 확인할 수 있어 서버의 자원에 접근성이 빠르다.
인증받은 사용자들에게 Token을 발급하고, 서버에 요청을 할 때 Header 에 Token을 함께 보내도록 하여 유효성 검사를 한다. 이러한 시스템에서는 더이상 사용자의 인증 정보를 서버나 세션에 유지하지 않고 클라이언트 측에서 들어오는 요청만으로 작업을 처리한다. 즉, Session / Cookie 방식과 달리 상태를 유지하지 않는 구조이다. 이러한 토큰 기반의 인증 방식을 통해 수많은 문제점들을 해결할 수 있는데, 대표적으로 사용자가 로그인이 되어있는지 안되어있는지 신경쓰지 않고 손쉽게 시스템을 확장할 수 있다.
세션/쿠키는 별도의 저장소의 관리가 필요하지만 JWT는 발급한 후 검증만 하면 되기 때문에 추가 저장소가 필요 없습니다. 이는 비상태유지 서버의 특징으로 볼 수 있다. 여기서 Stateless는 어떠한 별도의 저장소도 사용하지 않는, 즉 상태를 저장하지 않는 것을 의미합니다.
확장성이 우수하여 Token 기반으로 하는 다른 인증 시스템에 접근이 가능합니다. 예를 들어 Facebook 로그인, Google 로그인 Kakao 로그인(OAuth 2.0) 등은 모두 토큰을 기반으로 인증을 합니다.
- OAut??
인터넷 사용자들이 비밀번호를 제공하지 않고 다른 웹사이트 상의 자신들의 정보에 대해 웹사이트나 애플리케이션의 접근 권한을 부여할 수 있는 공통적인 수단으로서 사용되는, 접근 위임을 위한 개방형 표준이다.
여기까지의 글만 봤을 때는 JWT가 세션/쿠키 방식보다 더 효율적으로 보입니다. 하지만 JWT도 단점들이 존재합니다.
- 해결책
기존의 Access Token의 유효기간을 짧게 하고 Refresh Token이라는 새로운 토큰을 발급합니다. 그렇게 되면 Access Token을 탈취당해도 상대적으로 피해를 줄일 수 있습니다.
Payload는 따로 암호화되지 않기 때문에 디코딩하면 누구나 정보를 확인할 수 있습니다. (세션/쿠키 방식에서는 유저의 정보가 전부 서버의 저장소에 안전하게 보관됩니다) 따라서 유저의 중요한 정보들은 Payload에 넣을 수 없습니다.
인증이 필요한 요청이 많아질 수록 서버의 자원낭비가 발생하게 됩니다.