세션/ 쿠키 방식과 JWT 방식의 차이점을 비교하고 각 방식의 장단점
쿠키와 세션
쿠키와 세션은 HTTP 프로토콜을 보완하기 위한 방식이다. 세션/쿠키 방식을 알아보기 이전에 통신을하는 HTTP의 특징을 먼저 살펴보자
HTTP는 비연결성(Connectionless) 특징으로 인해 서버 자원을 효율적으로 관리할 수 있지만, 이는 클라이언트의 이전 작업을 서버가 기억하지 못하는(Stateless) 단점을 가지고 있습니다. 이를 보완하기 위해 세션과 쿠키라는 기술이 등장하게 되었다.
Connectionless: 클라이언트와 서버가 데이터를 주고 받을 때, 요청과 응답이 완료되면 연결을 끊는다.
Stateless: 클라이언트와 서버가 독립적인 특성을 가지고 있다. 한 번의 통신이 완료되면 서로의 상태정보를 갖고있지 않는다.
쿠키와 세션은 서버와 클라이언트 간의 상태 정보를 일정 기간 동안 유지하면서 사용자가 이전에 수행한 작업을 기억하는 데 도움을 준다.
쿠키와 세션
쿠키(Cookie)는 클라이언트 웹 브라우저에 정보를 저장하여 통신 한다.
이 정보는 HTTP 요청과 응답의 헤더에 포함되어 전송된다. 그러나 이러한 방식은 중간에 정보가 탈취되어 보안상 문제가 발생할 수 있다.
세션(Session) 은 클라이언트와 서버 사이에서 연결상태를 유지하는 것을 말한다.
세션은 서버측에서 클라이언트 요청에 따라 고유 ID를 생성하고 클라이언트로 응답한다. 클라이언트는 고유ID를 통해 서버와 연결 상태를 유지한다.
쿠키방식은 요청,응답 헤더에 정보를 저장하여 통신하며, 중간에 탈취될경우 보안에 큰 문제가 발생할 수 있게된다. 반면, 세션방식은 서버에서 데이터를 관리하기 때문에 쿠키 방식보다 보안적으로 더 나은 방식으로 볼 수 있다.
인증 방식에선 쿠키와 세션 방식을 같이 이용한다. 세션에 사용자의 정보를 저장하고 Session ID를 헤더에 저장하여 통신한다.
쿠키/세션 인증 방식
세션/쿠키 방식은 서버에서 클라이언트의 인증 정보를 저장하고, 클라이언트는 서버에 요청할 때마다 인증 정보를 전달하는 방식이다. 로그인 과정을 보며 프로세스를 이해해 보자
로그인 과정
- 클라이언트가 로그인 페이지에 접속한다.
- 클라이언트는 아이디와 비밀번호를 입력하고 로그인 을 수행한다.
- 서버가 로그인에 성공했다고 응답하면, 클라이언트의 쿠키에 세션ID를 저장한다.
- 클라이언트는 쿠키에 저장된 세션ID를 함께 전달하여 서버에 요청한다.
- 서버는 클라이언트가 전달한 세션ID를 확인하여 클라이언트가 인증된 사용자인지 확인한다.
- 장점
- 구현이 쉽다.
- 클라이언트의 상태를 유지할 수 있다.
- 단점
- 서버에서 인증 정보를 저장해야 하므로 서버의 부하가 증가할 수 있다.
- 클라이언트가 세션을 종료하지 않으면 서버의 메모리 사용량이 증가할 수 있다.
- 세션 도용을 통해 인증 정보를 탈취당할 수 있다.
JWT 인증 (토큰 기반 방식)
JWT에 관련한 내용은 여기 에서 확인해 볼 수 있다.
JWT 방식은 클라이언트와 서버 간에 JSON 객체로 된 토큰을 교환하여 인증을 수행하는 방식이다.
로그인 과정
- 클라이언트가 로그인 페이지에 접속한다.
- 클라이언트는 아이디와 비밀번호를 입력하고 로그인 을 수행한다.
- 로그인에 성공했다면, 서버는 JWT토큰을 생성하여 클라이언트에 응답한다.
- 클라이언트는 JWT토큰을 로컬에 저장한다.
- 클라이언트는 JWT토큰을 헤더에담아 서버에 요청한다.
- 서버는 JWT토큰을 확인하여 인증된 사용자인지 확인한다.
- 장점
- 서버에서 인증 정보를 저장할 필요가 없으므로 서버의 부하가 감소한다.
- 클라이언트의 상태를 유지할 수 있다.
- 세션 도용을 방지할 수 있다.
- 단점
- 구현이 복잡할 수 있다.
- 토큰의 길이가 길어 네트워크 부하가 증가할 수 있다.
- 토큰을 탈취당하면 인증 정보를 탈취당할 수 있다.
차이점
인증 정보 저장 위치: 세션/쿠키 방식은 서버에 인증정보를 저장하기 때문에, 서버의 메모리 사용량이 증가 할 수 있다. JWT방식은 클라이언트에 인증정보(token)를 저장하기때문에, 메모리 사용량이 증가하지 않는다.
확장성: 다중 애플리케이션 서버에서 세션/쿠키 방식은 여러서버마다 인증정보를 저장하거나 세션끼리의 공유를 통해 인증정보를 확인한다.
JWT 방식은 따로 인증정보를 저장하지 않으므로 서버마다 요청을 보내도 JWT를 파싱하여 DB에 저장되어있는 데이터와 일치하는지 확인하는 과정만 거치면됨!
서버부담: 세션/쿠키 방식은 서버에 인증정보를 저장해야하므로 서버의 부하가 따른다. 예를들어, 클라이언트가 요청을 보낼 때마다 서버에서 인증정보를 확인해야한다.
JWT 방식은 클라이언트에 인증정보를 저장하기 때문에 서버부하가 비교적 적다. 다만 playload에 많은 정보를 저장할 경우 서버에서 이를 파싱하는 과정에서 부담을 줄 수 있기 때문에 최소한의 정보만 담아야한다.
출처: https://hudi.blog/session-based-auth-vs-token-based-auth/
출처: https://dev-coco.tistory.com/61