[CS] 쿠키와 세션 | 사용 이유, 장단점, 차이점

dyomi·2024년 7월 26일

쿠키와 세션은 웹 애플리케이션에서 사용자 정보를 저장하고 관리하는 주요 방법이다.

사용 이유

서버와 클라이언트의 통신 프로토콜인 HTTP의 비연결성(요청에 대한 응답을 보내고 연결을 끊어버리기), 비상태성(클라이언트의 정보를 유지하지 않음)이라는 특징 때문에 서버는 클라이언트에 대한 상태정보를 유지하지 않는다.
즉, response를 보낸 후 클라이언트에 대해 알 수 없게 된다.

그래서 로그인과 같이 사용자 인증이 필요한 경우, 쿠키와 세션을 사용해서 페이지가 이동되더라도 계속 체크가 가능하도록 보통 개발한다.

사용자의 브라우저에 저장되는 작은 데이터 조각이다. 웹 서버가 HTTP 응답의 일환으로 쿠키를 설정하면, 브라우저는 해당 쿠키를 사용자의 컴퓨터에 저장하고 이후 요청시 서버로 다시 전송한다.

장점

  1. 브라우저를 닫고 다시 열어도 쿠키가 남아있어 지속적으로 상태를 유지할 수 있다.
  2. 사용자의 컴퓨터에 저장되므로 서버 자원을 사용하지 않는다.
  3. 설정과 접근이 비교적 간단하다.

단점

  1. 쉽게 변조될 수 있어 보안에 취약하다.
  2. 대부분의 브라우저는 도메인당 4kb의 데이터만 저장이 가능하다. (제한된 저장 용량)
  3. 프라이버시 침해 문제가 있다.

Session 세션

서버측에서 관리되는 사용자 상태 정보를 저장하는 방법이다. 사용자는 고유힌 sessoinID를 부여 받으며, 이 ID는 쿠키나 URL 파라미터를 통해 서버로 전달된다.

장점

  1. 서버측에서 관리되므로 변조 위험이 적다.
  2. 클라이언트 측에서 세션 ID만 관리하면 되므로, 사용자 경험이 단순해진다.
  3. 저장 용량에 대한 제약이 상대적으로 적다.

단점

  1. 서버 메모리나 디스크 공간을 차지한다.
  2. 브라우저를 닫으면 세션이 종료될 수 있으며, 서버가 재시작되면 세션 정보가 사라질 수 있다. (지속성 부족)
  3. 분산 서버 환경에서는 세션을 공유하는 것이 어려울 수 있다. (스케일링 문제)

차이점

  1. 저장 위치
    쿠키는 클라이언트(브라우저), 세션은 서버
  2. 지속성
    쿠키는 만료시간을 설정하여 지속성을 관리할 수 있다. 세션은 브라우저가 닫히면 종료되며, 서버 재시작시 사라질 수 있다.
  3. 보안성
    쿠키는 변조 위험이 있고, 세션은 변조 위험이 적다.
  4. 저장 용량
    쿠키는 보통 4kb 제한, 세션은 서버 자원이 허용하는 한 무제한
  5. 속도
    쿠키는 서버 요청시 속도가 빠르며, 세션은 서버에 정보가 있기 때문에 처리가 요구되어 비교적 느리다.

민감 정보나 사용자 인증 등 중요 데이터는 세션, 간단한 설정 정보나 트래킹 정보는 쿠키를 사용한다.



🌟 추가 질문

📍 세션은 어디에 저장이 될까?

  1. 메모리
    세션 정보가 웹 서버의 메모리에 저장되면, 접근 속도가 빠르고 구현하기 간단하다. 하지만 서버가 재시작되면 정보가 사라질 수 있고, 서버를 늘릴 경우, 한쪽에만 정보가 저장되어 정보 공유가 어렵다는 단점이 있다.

  2. 파일 시스템
    세션 정보를 파일로 저장하는 방식이다. 서버 재시작 시에도 세션 정보를 유지할 수 있지만, 파일 접근 속도가 메모리 접근 속도보다 느리다.

  3. 데이터베이스
    RDBMS, NoSQL 등 세션 정보를 데이터베이스에 저장하는 방식이다. 이는 영구 저장이 가능하며, 여러 서버간 세션 공유가 가능하므로 확장성과 지속성이 좋다. 하지만 설정이 복잡하고 데이터베이스 접근 속도 때문에 쿼리 오버헤드가 있을 수 있다.

  4. 클러스터링 환경
    여러 서버 간에 세션 정보를 복제하여 고가용성을 제공한다. 하지만 네트워크 트래픽이 증가하고 복제 오버헤드가 발생할 수 있다.

  5. 캐시 서버
    Redis, Memcached 등 세션 정보를 메모리 기반 캐시 서버에 저장한다. 이는 빠른 접근 속도와 분산 환경에서의 세션 공유를 동시에 제공한다.

세션 저장소는 애플리케이션의 요구 사항에 따라 다르다. 단순한 웹 애플리케이션에서는 서버 메모리에 저장하는 것이 일반적이지만, 확장성과 고가용성이 필요한 애플리케이션에서는 데이터베이스, 캐시 서버 또는 클라우드 서비스를 사용하는 것이 더 적합할 수 있다.


📍 만약 브라우저에서 쿠키 사용을 꺼버렸을 때, 무상태성인 HTTP 프로토콜에서 서버 쪽으로 정보를 전달하는 방법엔 무엇이 있을까?

  1. HTTP 요청 헤더에 정보 추가
  2. HTTP 바디에 정보 추가 (POST 방식)
  3. 요청 URL 파라미터로 정보 전송 (GET 방식)

📍 JWT 토큰
JWT(Json Web Token)는 JSON 객체를 사용하여 정보를 안전하게 전송하는 방식이다. 액세스 토큰(Access Token)과 리프레시 토큰(Refresh Token) 두가지로 나뉜다.

액세스 토큰은 사용자 인증 후, 보호된 자원에 접근하기 위해 사용된다. 유효 기간은 짧으며 주로 HTTP 헤더의 Authorization 필드에 Bearer 토큰으로 포함되어 전송한다.

리프레시 토큰은 만료된 액세스 토큰을 갱신하기 위해 사용된다. 액세스 토큰과 마찬가지로 HTTP 요청에서 전송되며, 액세스 토큰보다 훨씬 긴 유효 기간을 가진다. (액세스 토큰을 새로 발급 받으면 리프레시 토큰도 새로 발급된다.)

보통은 액세스 토큰과 리프레시 토큰 모두 헤더에 넣고 전송한다.
하지만 보안상 액세스 토큰은 헤더에, 리프레시 토큰을 쿠키에 넣어 전송하는 경우도 있다.
자바스크립트가 액세스 할 수 있는 영역 중에 쿠키는 포함이 되지 않기 때문에 쿠키 안에 있는 정보는 뺄 수 없다. 그래서 유효 기간이 긴 리프레시 토큰은 좀 더 안전한 쿠키에 넣어 전송하는 방법이 있다.



참고 자료
[Web] 쿠키와 세션의 차이점, 인증과 인가, 세션 기반 인증 방식
spring httpsession 동작방식?

profile
기록하는 습관

0개의 댓글