Cookie와 Session
등장 배경
- HTTP는 Stateless로 상태 정보를 유지 하지 않음
- 즉 두 번째 연결이 첫 번째 연결을 기억하지 않는다.
- 또한 비연결지향(Connectionless) 프로토콜로
- 때문에 매 요청마다 사용자를 확인하는 과정이 필요하다.
- 이러한 번거로움으로 인해 쿠키와 세션이 등장
Cookie
- Client 단에 저장되는 정보(웹 브라우저에 저장)
- 사용자가 별도의 요청을 하지 않아도 브라우저는 request시 Request Header에 넣어 자동으로 서버에 전송
- Browser마다 저장되는 쿠기가 다름
- Browser가 다르면 다른 사용자로 인식
- 크롬에서 생성한 쿠키를 IE에서 사용할 수 없음
- 서버에서 사용자의 컴퓨터에 저장하는 정보파일
- 사용 목적
- 세션 관리: 사용자 아이디, 접속시간, 장바구니 등의 서버가 알아야 할 정보 저장
- 개인화: 맞춤 광고와 같이 개인에 맞춘 페이지
- 트래킹: 사용자의 행동과 패턴을 분석하고 기록
매번 로그인 없이 페이지를 돌아다닐 수 있는 이유는 사용자 정보를 유지해주는 쿠키 덕분
- 구성 요소
- key - value
- 유효기간 (Expires, max-age)
- 만료 기간에 따라 영구쿠키(만료기간존재)와 세션쿠키(만료기간X, 브라우저 종료 시 삭제)가 존재한다.
- 도메인 : 어떤 서버로 전송되어야 하는지를 지정할 수 있음
- 현재 서버의 주소 혹은 상위 도메인 지정 가능
- 따로 설정하지 않으면 생성된 서버로 설정됨
- 네이버 쇼핑(shopping.naver.com)에서 생성한 쿠키를 네이버(naver.com) 도메인 안에서 유지하고 싶을 때, 쿠키의 도메인을 naver.com으로 지정
- 경로 : 쿠키를 전송한 요청 경로
- cookie.setPath("/user") : /user로 요청시 쿠키 전송
- 동작 순서
- Client가 페이지를 요청
- WAS는 Cookie를 생성
- HTTP Header에 Cookie를 넣어 응답
- Browser는 넘겨받은 Cookie를 PC에 저장, 요청시 Cookie와 함께 전송
- Browser가 종료되어도 만료기간이 남아있다면 Cookie가 보관되어, 동일 사이트 재방문시 요청페이지와 함께 쿠키를 Request header에 담아 함께 전송
- 사용 예시
- 방문했던 사이트에 다시 방문 하였을 때 아이디와 비밀번호 자동 입력
- 팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크
- 특징
- 클라이언트에 총 300개의 쿠키 저장 가능
- 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
- 하나의 쿠키에 4KB까지 저장 가능하다.
- 단점
- 방문한 웹 사이트에 대한 개인정보가 기록되기 때문에 사생활 침해의 소지가 있음
- HTTP 요청 시 자동으로 모든 쿠키를 전송하기 때문에 불필요한 트래픽이 증가한다.
- 클라이언트 단에 저장되는 정보로 보안 취약
- CSRF를 당할 수 있다. 이는 쿠키가 자동으로 담아 다운받아지는 것을 이용해 악성 스크립트를 담아 보내는 것이다.
- 또한 XSS도 당할 수 있는데 이는 위와 동일하지만 민감 정보 탈취(토큰 등)를 하는 행위이다.
- 대안으로 세션이 등장하였고, 취약한 정보를 담는 것은 위험
- 세션 하이재킹의 위험이 있음
- 세션 하이재킹 공격이란 이미 인증되어 발급 상태인 세션 식별자(SESSION-ID)를 가로채 인증 없이 사용자의 권한으로 서버에 접근하는 것이다. 데이터 트래픽 암호화가 필요하다.(https)
- javax.servlet.http.Cookie
- 생성 : Cookie cookie = new Cookie(String name, String value)
- 값 변경/얻기 : cookie.setValue(String value) / cookie.getValue();
- 도메인, 경로 변경/얻기 : cookie.setPath(String path) / cookie.getPath() 아마도
- 유효기간 지정/얻기 : cookie.setMaxAge(0); // 삭제 , cookie.getMaxAge();
- 생성된 cookie를 client에 전송 : reponse.addCookie(cookie);
- client에 저장된 cookie 얻기 : Cookie[] cookies[] = request.getCookies();
Session
방문자가 웹 서버에 접속해 있는 상태이다.
- WAS의 memory에 Object의 형태로 저장.
- 동작 순서
- 클라이언트가 페이지를 요청
- 서버는 접근한 클라이언트의 Request-Header 필드인 Cookie를 확인하여, 클라이언트가 session-id를 보냈는지 확인.
- session-id가 존재하지 않는다면, 서버는 session-id를 생성해 클라이언트에게 돌려준다. 이 때 쿠키는 세션쿠키를 사용한다.
- 서버에서 클라이언트로 돌려준 session-id를 쿠키를 사용해 서버에 저장(JSESIONID : 세션 ID를 저장하는 쿠키 이름)
- 클라이언트는 재접속 시, JSESIONID를 이용하여 session-id값을 서버에 전달
- 특징
- 웹 서버에 저장되는 쿠키 (=세션 쿠키)
- 브라우저를 닫거나, 서버에서 세션을 삭제 했을 때 삭제가 되므로, 쿠키보다 보안이 좋다. (탈취당하면 악의적인 행동 가능해서 사실 모르겠다.)
- 저장 데이터에 제한이 없다. (Object 형태로 저장, 메모리 공간만큼 저장 가능)
- 동접자 수가 많으면 서버 메모리에 과부하가 올 수 있음
- 각 클라이언트에 고유 Session ID를 부여하여 각 클라이언트 요구에 맞는 서비스 제공
- 세션 유지 기간은 web.xml에서 설정 가능하고, 보통 기본 30분으로 설정되어 있다.
- 사용 예시
- 화면이 이동해도 로그인이 풀리지 않고 로그아웃하기 전까지 유지
Cookie와 Session의 차이
- 쿠키는 만료시간이 지날때까지 파일 형태로 정보를 저장하는 반면,세션은 만료 시간을 서버측에서 설정하고 브라우저가 닫히면 만료시간에 상관없이 삭제
- 쿠키는 클라이언트 로컬에 리소스가 저장되어 보안에 취약하지만, 세션은 sessionid만 쿠키에 저장하고 웹 서버 리소스를 사용하기 때문에 보안성이 더 좋음
- 하지만 결국 sessionid가 탈취당한다면 의미 없다고 생각
- 세션은 서버의 처리가 필요하기 때문에 쿠키보다 속도가 느림.
- 세션을 많이 사용하면 서버의 메모리가 감당할 수 없어질 때가 있고 속도가 느려질 수 있음.
- 쿠키와 세션은 비슷한 역할을 하고, 동작 원리도 비슷하다. 결국 세션도 쿠리르 사용하기 때문이다.
정리하자면 저장 위치와 보안 , 그리고 라이프 사이클이다.
Cache
캐시는 웹 페이지 요소를 저장하기 위한 임시 저장소이고, 쿠키/세션은 정보를 저장하기 위해 사용된다. 캐시는 웹 페이지를 빠르게 렌더링 할 수 있도록 도와주고, 쿠키/세션은 사용자의 인증을 도와준다.
- 캐시는 이미지,비디오,오디오,css,js파일 등 데이터나 값을 미리 복사해 놓는 리소스 파일들의 임시 저장소이다.
- 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다.
- 같은 웹 페이지에 접속할 때 사용자의 PC에서 로드하므로 서버를 거치지 않아도 된다.
- 이전에 사용된 데이터가 다시 사용될 가능성이 많으면 캐시 서버에 있는 데이터를 사용한다.
- 그래서 다시 사용될 확률이 있는 데이터들이 빠르게 접근할 수 있어진다. (페이지 로딩 속도 업)
- 캐시 히트 -> 캐시를 사용 가능한경우(이전에 왔던 요청이 다시 왔을 때)
- 캐시 미스 -> 캐시 사용 못하는 경우(웹서버 처음 요청)