Cookie와 Session

HunkiKim·2022년 9월 8일
0

Cookie와 Session

등장 배경

  • HTTP는 Stateless로 상태 정보를 유지 하지 않음
    • 즉 두 번째 연결이 첫 번째 연결을 기억하지 않는다.
  • 또한 비연결지향(Connectionless) 프로토콜로
    • 응답을 보내며 연결을 해제한다.
  • 때문에 매 요청마다 사용자를 확인하는 과정이 필요하다.
  • 이러한 번거로움으로 인해 쿠키와 세션이 등장
  • Client 단에 저장되는 정보(웹 브라우저에 저장)
  • 사용자가 별도의 요청을 하지 않아도 브라우저는 request시 Request Header에 넣어 자동으로 서버에 전송
  • Browser마다 저장되는 쿠기가 다름
    • Browser가 다르면 다른 사용자로 인식
    • 크롬에서 생성한 쿠키를 IE에서 사용할 수 없음
  • 서버에서 사용자의 컴퓨터에 저장하는 정보파일
    • key, value쌍의 String 형태
  • 사용 목적
    • 세션 관리: 사용자 아이디, 접속시간, 장바구니 등의 서버가 알아야 할 정보 저장
    • 개인화: 맞춤 광고와 같이 개인에 맞춘 페이지
    • 트래킹: 사용자의 행동과 패턴을 분석하고 기록
      매번 로그인 없이 페이지를 돌아다닐 수 있는 이유는 사용자 정보를 유지해주는 쿠키 덕분
  • 구성 요소
    • key - value
    • 유효기간 (Expires, max-age)
      - 만료 기간에 따라 영구쿠키(만료기간존재)와 세션쿠키(만료기간X, 브라우저 종료 시 삭제)가 존재한다.
    • 도메인 : 어떤 서버로 전송되어야 하는지를 지정할 수 있음
      • 현재 서버의 주소 혹은 상위 도메인 지정 가능
      • 따로 설정하지 않으면 생성된 서버로 설정됨
      • 네이버 쇼핑(shopping.naver.com)에서 생성한 쿠키를 네이버(naver.com) 도메인 안에서 유지하고 싶을 때, 쿠키의 도메인을 naver.com으로 지정
    • 경로 : 쿠키를 전송한 요청 경로
      • cookie.setPath("/user") : /user로 요청시 쿠키 전송
  • 동작 순서
    1. Client가 페이지를 요청
    2. WAS는 Cookie를 생성
    3. HTTP Header에 Cookie를 넣어 응답
    4. Browser는 넘겨받은 Cookie를 PC에 저장, 요청시 Cookie와 함께 전송
    5. Browser가 종료되어도 만료기간이 남아있다면 Cookie가 보관되어, 동일 사이트 재방문시 요청페이지와 함께 쿠키를 Request header에 담아 함께 전송
  • 사용 예시
    • 방문했던 사이트에 다시 방문 하였을 때 아이디와 비밀번호 자동 입력
    • 팝업창을 통해 "오늘 이 창을 다시 보지 않기" 체크
  • 특징
    • 클라이언트에 총 300개의 쿠키 저장 가능
    • 하나의 도메인 당 20개의 쿠키를 가질 수 있다.
    • 하나의 쿠키에 4KB까지 저장 가능하다.
  • 단점
    • 방문한 웹 사이트에 대한 개인정보가 기록되기 때문에 사생활 침해의 소지가 있음
    • HTTP 요청 시 자동으로 모든 쿠키를 전송하기 때문에 불필요한 트래픽이 증가한다.
      • 쿠키 거부 기능 제공 (웹스토리지5)
    • 클라이언트 단에 저장되는 정보로 보안 취약
      - 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에서 로드하므로 서버를 거치지 않아도 된다.
  • 이전에 사용된 데이터가 다시 사용될 가능성이 많으면 캐시 서버에 있는 데이터를 사용한다.
  • 그래서 다시 사용될 확률이 있는 데이터들이 빠르게 접근할 수 있어진다. (페이지 로딩 속도 업)
  • 캐시 히트 -> 캐시를 사용 가능한경우(이전에 왔던 요청이 다시 왔을 때)
  • 캐시 미스 -> 캐시 사용 못하는 경우(웹서버 처음 요청)

0개의 댓글