쿠키는 웹 사이트가 웹 브라우저를 통해 사용자의 컴퓨터에 남기는 작은 데이터 조각입니다.
웹 사이트(서버) -> 웹 브라우저 -> 사용자 컴퓨터
쿠키는 서버에서 HTTP Response Header에 set-Cookie
속성을 이용하여 클라이언트에 쿠키를 제공합니다. 쿠키에는 '이름, 값, 만료 기간, 경로 정보' 등이 들어 있습니다.
서버가 사용자의 웹 브라우저에 이 데이터 조각을 전송해주고, 웹 브라우저는 이를 저장해놓습니다. 그리고 동일한 서버에 재요청을 보낼 때, 저장된 쿠키도 함께 전송합니다. 이때 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지를 판단할 때 사용하게 됩니다. 이렇게 쿠키를 이용하면 사용자의 로그인 상태를 유지할 수 있습니다. 상태가 없는 HTTP 프로토콜에서 상태 정보를 기억시켜주기 때문입니다.
클라이언트가 request를 서버에 보내고, 서버는 클라이언트에 response를 주고 '연결(connection)을 끊는' 특성이 있습니다. 그리고 http 1.1버전에서는 커넥션을 유지하고 요청에 재활용하는 기능이 추가되었습니다. http header에 keep-alive 옵션을 주어서 커넥션을 재활용하게 하는 것이죠.
커넥션을 끊는 순간, 클라이언트와 서버의 통신은 끝나며 '상태 정보를 유지하지 않는' 특성이 있습니다.
쿠키는 웹 사이트를 사용하는 방문자의 웹 경험을 개인화하는데 사용하는 것이죠. 따라서 웹 사이트에 접근할 때, 사용자의 기본 설정 또는 입력값이 쿠키에 포함되어 저장될 수 있습니다. 그리고 사용자는 이러한 쿠키가 생성되어 남는 것을 허용, 거부, 삭제할 수 있도록 웹 브라우저를 설정할 수 있습니다.
세션 관리
서버에 저장해야 할 '로그인 상태 유지(자동 로그인), 장바구니, 게임 스코어, 팝업 다시보지 않기 설정' 등의 정보를 관리합니다.
개인화
사용자 개인 선호 설정 및 테마 정보를 관리합니다.
트래킹
사용자의 행동을 기록하고 분석할 수 있습니다.
과거에는 클라이언트 측에 정보를 저장하는 방식이 쿠키가 유일했지만, 현재는 modern storage APIs가 나왔습니다. 따라서 이 방식을 사용하는 것이 더 권장되는데 그 이유는 쿠키는 모든 서버에 대한 요청을 보낼 때 쿠키가 함께 전송되기 때문에, 성능이 떨어지는 원인이 될 수 있기 때문입니다. Modern APIs에는 웹 스토리지(로컬 스토리지, 세션 스토리지)와 IndexedDB 등이 있습니다.
세션 쿠키
현재 세션이 종료될 때, 쿠키도 삭제됩니다. 브라우저가 현재 세션을 끝나는 시점을 정의합니다. 보통 브라우저가 종료될 때 주로 세션도 종료되지만, 브라우저가 재시작할 때 세션을 복원한다면 세션 쿠키가 무기한 존재할 수도 있습니다.
영속적인 쿠키
영속적인 쿠키는 Expires 속성에 명시된 날짜에 삭제되거나, Max-Age 속성에 명시된 기간 이후에 삭제됩니다.
쿠키는 클라이언트에 최대 300개까지 저장이 가능합니다. 서버 도메인 1개당 최대 20개의 쿠키를 저장할 수 있습니다. 쿠키 1개 당 최대 4kb까지 저장할 수 있습니다.
서버에 클라이언트의 상태 정보를 저장하는 기술로, '논리적인 연결'을 세션이라고 합니다. 서버에서 클라이언트에 대한 정보를 저장하고, 클라이언트에는 각 클라이언트를 구분할 수 있는 ID값을 부여하는데 이를 '세션 아이디'라고 합니다. 이때 세션 아이디는 브라우저 단에서 관리될 수 있도록 쿠키로 저장됩니다. 주로 '로그인 정보를 유지'하는 데 세션 기술을 사용합니다.
'글쓰기, 댓글 달기, 배송정보 저장' 등 웹 페이지에서 로그인이 필수로 요구되는 동작을 수행할 때, 서버는 각 request를 보내는 클라이언트가 누군지 알아야 합니다. 따라서 사용자를 구분하고 인증하기 위해서는 아이디와 비밀번호를 함께 전달해줘야 하죠. 하지만 요청을 보낼 때마다 매번 전달해주기에는 너무 번거로우니, '세션'이라는 개념을 이용하는 것입니다.
클라이언트가 올바른 '아이디와 비밀번호'를 전달하여 한번 로그인에 성공하면, 서버는 알파벳과 숫자가 혼합된 '세션 아이디'를 만들어서 클라이언트에 줍니다. 그러면 이 세션의 유효기간이 끝날 때까지는 다시 로그인을 하지 않아도 되도록 세션이 유지되는 것입니다.
쿠키는 정보가 클라이언트 메모리에 저장되고, 세션은 정보를 구분할 수 있는 아이디값만 클라이언트 메모리에 저장될 뿐 실제 데이터는 서버 메모리에 저장됩니다.
쿠키는 클라이언트 즉, 로컬에 저장되어 있기 때문에, 파일로 저장되는 경우 탈취, 변조가 될 위험이 있습니다. 또한 Request/Response 과정에서 스나이핑 당할 위험이 있어 보안에 비교적 취약합니다. 하지만 Session은 클라이언트 정보 자체가 서버에 저장되어 있기 때문에 비교적 안전하다고 할 수 있습니다.
그럼에도 불구하고, 쿠키를 쓰는 이유는 쿠키는 클라이언트에서 바로 정보를 갖고 있기 때문에 아이디값을 이용해서 서버로부터 데이터를 참고해야 하는 세션보다 속도나 비교적 빠르기 때문입니다. 그리고 세션은 서버의 자원을 사용하기 때문에, 리소스 사용 및 속도에 한계를 갖고 있습니다.
캐시는 이미지 파일, css, js 파일 등이 웹 브라우저에 저장되어, 같은 요청을 보내어 동일한 자원을 로드해야 할 때, 요청을 가로채어 보내지 않고 이미 캐시되어 있는 자원을 바로 사용해서 자원과 시간을 절약하는 기술입니다. 따라서 쿠키, 세션처럼 상태 데이터 관리를 목적으로 하는 기술과 다르죠.
캐시는 한번 저장되면 다음 요청에는 같은 자원을 반복적으로 사용되기 때문에, 해당 자원이 변경되어 새롭게 로드해야 하는 경우에는 잘못된 출력이 발생할 수 있습니다. 따라서 이때는 브라우저 캐시를 직접 삭제해주거나, 서버에서 클라이언트로 응답을 보낼 때 header에 캐시 자원의 만료시간을 명시하는 방법으로 회파할 수 있습니다.
세션의 단점은 서버에서 저장할 수 있는 공간의 한계가 있기 때문에, 동시 접속하는 사용자가 많아지면 서버에 부하가 걸리고 화면이 정상동작하지 않을 수도 있다는 것입니다.
따라서 대안으로 서버에서 세션 아이디 대신 토큰을 발급하는 것입니다. 토큰 생성 및 검증 알고리즘이 특수한 수학적 원리로 동작하여, 이를 클라이언트에 제공해주면 사용자는 이를 쿠키로 저장해두고 세션 아이디 대신 사용자 검증에 사용하는 것입니다.
쿠키 : 서버에서 생성, 클라이언트에 정보 저장,
세션 : 서버에서 생성, 클라이언트에 세션 아이디 저장(쿠키), 서버에 정보 저장,
토큰 : 서버에서 생성, 클라이언트에 토큰 저장(쿠키)
MDN web docs
Web - 쿠키와 세션의 차이, 용도, 사용법(cookie,session)
데이터를 저장하는 5가지 개념