Cookie(쿠키)
- 웹 사이트에 접속할 때 서버에 의해 사용자의 컴퓨터(브라우저)에 저장되는 정보
<이름>=<값>
형태의 단순한 문자열
- 유실, 변조, 도난 등 보안에 취약하여 개인정보 등은 저장해서는 안됨
쿠키를 다루는 방법
- HTTP 메시지의 헤더(header) 영역을 통해서 송/수신
Set-Cookie:user=홍길동
서버에서 클라이언트로 쿠키 전달(응답)
Cookie:user=홍길동;
클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달
쿠키를 사용하는 이유
- HTTP는 무상태(Stateless) 비연결지향(Connectionless) 프로토콜
- 클라이언트와 서버가 요청과 응답을 주고 받으면 연결이 끊어지고, 다시 요청할 때 서버는 이전 요청을 기억하지 못함
- 사용자 로그인 세션 관리, 장바구니, 광고 정보 트래킹(서드파티 쿠키) 등으로 활용
쿠키의 속성
생명주기 - expires, max-ages
- expires (만료일이 되면 쿠키 삭제)
Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
- max-ages (지정 시간이 지나면 쿠키 삭제)
Set-Cookie: max-age=3600
(3600초)
- expires나 max-ages를 통해 만료 시점을 관리하는 쿠키를 영속쿠키 / 그렇지 않은 쿠키를 세션쿠키라고 하며, 세션 쿠키는 브라우저 종료시 삭제되고 영속 쿠키는 브라우저 종료에도 유지
도메인 - domain
- 명시: 명시한 문서 기준 도메인 + 서브 도메인 포함
domain=example.org
→ dev.example.org도 쿠키 접근 가능
- 생략: 현재 문서 기준 도메인만 적용
- 현재 문서인 example.org에서만 쿠키 접근 가능
경로 - path
- 이 경로를 포함한 하위 경로 페이지만 쿠키 접근
path=/home
→ /home/* 가능
path=/
→ (루트 경로 지정: 모든 요청에 쿠키 전달)
보안 - Secure, HttpOnly, SameSite
- Secure
- HttpOnly
- SameSite
- CSRF(XSRF) 공격 방지
- 요청 도메인과 쿠키에 설정된 도메인이 같은 경우(= 퍼스트 파티 쿠키)만 전송
None
, Lax
, Strict
세 가지 옵션(정책)
Session(세션)
- 웹 사이트의 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법
- 일정 시간동안 같은 브라우저로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술
- 서비스가 돌아가는 서버 측에 데이터를 저장하고, 세션의 키값만을 클라이언트 측에 남겨둠
- 브라우저는 필요할 때마다 이 키값을 이용하여 서버에 저장된 데이터를 사용
세션을 다루는 방법
세션을 사용하는 이유
- 쿠키를 통해 세션 ID만 노출시키고 개인정보나 민감한 데이터를 노출시키지 않음
- 보안에 취약한 쿠키를 보완해주는 역할
- 매 요청마다 전송하는 쿠키의 크기가 커지면 상당한 트래픽을 유발할 수 있음
다중 서버 환경에서의 세션 관리
- 세션에 대한 처리가 없는 로드 밸런싱(Load Balancing) 환경
- 데이터 불일치(정합성)
- ex) A 유저가 1번 서버에서 로그인 한 뒤 2번 서버에 요청을 보내면 2번 서버에는 세션 정보가 없어 실패한다.
- 스티키 세션(Sticky Session)
- 장애 발생시 세션 유실(가용성)
- 하나의 서버로 요청이 몰릴 수 있음
- 분산 환경을 완벽히 사용할 수 없음
- 세션 클러스터링(Session Clustering)
- all-to-all Session Replication
- 모든 세션이 동일한 데이터를 가질 수 있도록 복사
- 세션 수가 늘어날 수록 불필요한 메모리 사용이 늘고 성능 저하 발생
- primary-secondary Session Replication
- primary node/ backup(secondary) node / 나머지 proxy node 들로 구성
- primary node의 세션 데이터는 오직 backup node에만 저장
- proxy는 주소값만 들고있어 해당 주소로 세션 데이터 요청
- primary node가 다운되어도 backup node로부터 데이터를 복사해서 가져온 뒤 해당 노드가 primary로 승격
- 대용량 트래픽은 빈번한 데이터 복사를 발생시켜 성능 저하 발생할 수 있음
- 세션 스토리지(Session Storage)
- Disk based vs In-Memory
- 데이터의 영속성(permanence), 내구성(dutability) vs 빠른 응답시간
- 세션은 빠른 응답이 더 중요할 수 있음
- Redis
- Key-Value
- Replication(Master-Slave, failover)을 통한 장애 극복
출처
더 알아보기
개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.