쿠키와 세션 차이
쿠키(Cookie)와 세션(Session)은 웹 개발에서 클라이언트와 서버 간의 지속적인 상태 정보를 유지하기 위해 사용되는 기술입니다. HTTP 프로토콜은 Stateless(무상태성) 특성을 가지고 있어서, 요청마다 사용자의 정보를 기억하지 않습니다. 이를 보완하기 위해 쿠키와 세션을 사용합니다.
쿠키
- 클라이언트(브라우저)에 저장: 쿠키는 사용자의 컴퓨터에 저장되는 작은 텍스트 파일입니다.
- 보안 취약점: 쿠키는 클라이언트 측에 저장되기 때문에 보안에 취약합니다. 따라서 중요한 정보는 쿠키에 저장하지 않는 것이 좋습니다.
- 용량 제한: 각 브라우저마다 쿠키의 저장 용량에 제한이 있습니다.
- 만료 시간 설정: 쿠키는 만료 날짜를 설정할 수 있어, 해당 날짜가 지나면 자동으로 삭제됩니다.
세션
- 서버에 저장: 세션은 서버에 저장됩니다. 이 때문에 쿠키보다 보안이 더 강합니다.
- 쿠키를 사용해 세션 ID 저장: 사용자가 서버에 접속하면, 서버는 세션 ID를 생성하고 이를 쿠키에 저장하여 클라이언트에게 전송합니다.
- 메모리 공간 사용: 세션은 서버의 메모리를 사용하기 때문에, 많은 양의 세션이 생성될 경우 서버의 성능에 영향을 줄 수 있습니다.
- 만료 정책: 세션도 만료 정책을 설정할 수 있으며, 사용자가 명시적으로 로그아웃하거나, 설정된 시간 동안 활동이 없을 경우 세션을 종료할 수 있습니다.
세션 방식의 로그인 과정
1.사용자 인증: 사용자가 아이디와 비밀번호로 로그인을 시도합니다.
2.세션 생성: 서버는 사용자의 로그인 정보를 검증한 후, 사용자에 대한 세션을 생성합니다.
3.세션 ID 전송: 생성된 세션의 고유 ID를 쿠키에 담아 클라이언트에게 전송합니다.
4.클라이언트의 요청: 이후 클라이언트는 서버에 요청을 할 때마다 이 쿠키(세션 ID가 담긴)를 서버에 전송합니다.
5.세션 ID 확인: 서버는 쿠키에 담긴 세션 ID를 확인하고, 해당 세션에 저장된 사용자 정보를 바탕으로 요청을 처리합니다.
HTTP의 Stateless 특성
HTTP는 Stateless, 즉 무상태 프로토콜입니다. 이는 서버가 이전에 수행했던 요청에 대한 정보를 기억하지 않는다는 것을 의미합니다. 각각의 요청은 독립적이며, 서버는 이전의 요청이나 상태에 대해 알지 못합니다. 이로 인해 서버의 오버헤드가 감소하지만, 사용자의 상태 정보를 유지하는 데는 한계가 있습니다.
Stateless와 세션의 관계
세션은 사실상 HTTP의 Stateless 특성과 상반되는 개념입니다. 세션을 통해 서버는 클라이언트의 상태를 유지하며, 이전의 요청과 관련된 정보를 기억할 수 있습니다. 하지만 이는 서버에 추가적인 부하를 주며, 확장성에도 영향을 미칠 수 있습니다. 따라서 세션을 사용할 때는 이러한 점을 고려해야 합니다.
여러 서버에서의 세션 관리
규모가 커져 서버가 여러 개가 되면, 세션 관리는 더 복잡해집니다. 이를 해결하기 위한 몇 가지 방법은
- 스티키 세션(Sticky Session): 로드 밸런서를 사용해 사용자의 요청을 항상 같은 서버로 보내는 방식입니다. 하지만, 특정 서버에 장애가 발생하면 해당 사용자의 세션 정보가 손실될 수 있습니다.
- 세션 복제(Session Replication): 세션 정보를 모든 서버에 복제합니다. 이는 데이터 일관성을 보장하지만, 네트워크 트래픽과 서버 부하가 증가하는 단점이 있습니다.
- 중앙 집중식 세션 저장소: Redis나 Memcached와 같은 중앙 집중식 데이터 스토어를 사용하여 세션을 관리합니다. 이 방법은 확장성과 높은 가용성을 제공합니다.