Session&Cookie


Cookie란?

  • 클라이언트 로컬에 저장되는 키와 값이 들어간 작은 데이터 파일
  • 특정 웹 사이트를 방문 했을 때 만들어지는 정보를 담는 파일을 지칭하는것
  • 상태정보 유지하는 기술
  • 서버에서 HTTP Response Header에 Set-Cookie속성을 이용해 클라이언트에 쿠키 제공
  • 이름, 값, 만료 날짜/시간 (쿠키 저장기간), 경로 정보 포함
  • 클라이언트의 상태 정보를 로컬에 저장했다가 요청할 때 참조함
  • 서버측에서 만료 날짜/시간을 지정하여 정해진 시간동안 데이터 (상태정보)를 유지할 수 있음
  • 이름 - 각각의 쿠키를 구별하는 데 사용되는 이름
  • 값 - 쿠키의 이름과 관련된 값
  • 유효시간 - 쿠키의 유지시간
  • 도메인 - 쿠키를 전송할 도메인
  • 경로 - 쿠키를 전송할 요청 경로

Session Cookie(세션 쿠키)와 Persistent Cookie(지속 쿠키)

  • Session Cookie(세션 쿠키)
    • 만료 날짜/시간을 지정하지 않으면 메모리에 있는 동안 계속 유효하다고 판단하도록 세션 쿠키에 저장
    • 브라우저 메모리에 저장되므로 브라우저가 종료되면 쿠키는 사라지게 됨
    • 참고로 세션 쿠키의 값은 보안상 꽤나 안전한 브라우저 (ex. 구글 크롬)의 메모리에 저장되기 때문에 보안에 유리
  • Persistent Cookie(지속 쿠키)
    • 만료 날짜/시간을 지정하면 프로세스가 종료되더라도 즉, 메모리에서 사라지더라도 특정 만료날짜/시간까지 유효하므로 지속 쿠키에 저장됨
    • 파일로 저장되므로 브라우저가 종료되어도 쿠키는 남아있게 됨
    • 파일로 저장되는 지속 쿠키의 경우 비교적으로 보안에 취약함

Cookie의 활용

  • 자동 로그인
  • 방문한 사이트
  • 광고나 공지 팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크
  • 쇼핑몰 장바구니
  • 게임 점수 저장
  1. 브라우저에서 웹페이지에 접속
  2. 클라이언트가 요청한 웹페이지를 응답으로 받으면서 HTTP 헤더를 통해 해당 서버에서 제공하는 쿠키 값을 응답으로 전달
  3. 클라이언트는 해당 쿠키를 저장
  4. 클라이언트가 웹페이지를 요청한 서버에 재 요청시 받았던 쿠키 정보도 같이 HTTP 헤더에 담아서 요청
  5. 서버는 클라이언트의 요청에서 쿠키 값을 참고하여 비즈니스 로직을 수행한다. (ex 로그인 상태 유지)

Cookie의 특징

  • 브라우저 종료되어도 쿠키 만료 기간이 있다면 클라이언트에서 보관하고 있음
  • 사용자가 별도로 요청하지 않아도 브라우저에서 서버에 요청시에 Request Header에 쿠키 값을 넣어 요청함
  • (= 자동임으로 전달)
  • 모든 쿠키가 전달되는 것이 아니라 쿠키에 대한 도메인 설정을 통해서 지정한 도메인으로 요청할 때만 쿠키 값이 제공
  • 자동 전달하지 않는 방법: 크롬의 시크릿 모드로 접속 (쿠키 저장이 안되는 브라우저)

Cookie의 한계

  • 클라이언트에 최대 300개 까지 쿠키 저장 가능
  • 서버 도메인 하나당 최대 20개의 쿠키 저장 가능
  • 하나의 쿠키 값은 최대 4KB까지 저장 가능
  • 쿠키만을 온전히 인증에 사용하지 않음
    • 쿠키는 노출이 되었을 때 아이디나 패스워드 민감 정보까지 다 노출되어 보안이 좋지 않음
    • 조작 당해서 들어올 가능성
    • 웹 브라우저마다 쿠키에 대한 지원 형태가 다름 (다른 브라우저간 공유 불가능)
    • 쿠키 사이즈 제한 (4KB), 원하는 만큼의 충분한 데이터 담을 수 없음
    • 서버는 매번 아이디 패스워드를 받아서 인증해야하는 불편함

Session

Session이란?

  • 일정 시간 동안 같은 사용자로 부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 일정하게 유지시키는 기술
    • 웹 브라우저를 통해 웹 서버에 접속한 시점 ~ 웹 브라우저를 종료할 때까지
  • 방문자가 웹서버에 접속해 있는 상태를 하나의 단위로 보고 세션이라고 칭함
  • 서버에 클라이언트의 상태 정보를 저장하는 기술
  • 논리적인 연결을 세션이라고 함
  • 웹 서버에 클라이언트 정보 저장을 위해 세션 아이디를 만들어 서비스가 돌아가고 있는 서버에 저장
  • 클라이언트에게는 클라이언트를 구분할 수 있는 세션 아이디를 전달함

Session Process

  1. 클라이언트가 서버에 요청했을 때 필요에 따라 세션에 클라이언트에 대한 데이터를 저장하고 세션 아이디를 응답을 통해 발급해 줌
    • 브라우저 단에서 관리될 수 있도록 쿠키로 발급하는게 일반적인 구조임
  2. 클라이언트는 발급받은 세션 아이디를 JSESSIONID라는 쿠키로 저장
    • 해당 아이디가 있어야 인증이 완료되니 보안이 좋아짐
    • 보안 문제가 발생하면 (세션 ID 쿠키 탈취 등) 세션 저장소를 지우면 됨 해당 아이디로 접근 아예 불가
  3. 클라이언트는 다시 서버에 요청할 때 세션 아이디를 서버에 전달하여 상태 정보를 서버가 활용할 수 있도록 해줌
  4. 인증이 필요한 API일 때 서버는 세션 ID가 세션 저장소에 있는지 확인함
  5. 있다면 인증 완료후 API 처리, 없다면 401 에러 반환

Session의 특징

  • 세션은 쿠키 기반이지만 사용자 정보 파일을 서버 측에 저장
  • 세션을 통해 클라이언트의 정보는 서버에 두고 세션 아이디를 이용해서 인증받고 정보 이용
    • 세션 아이디는 각 클라이언트마다 고유함
  • 세션은 사용자들의 로그인 정보에 대한 보안을 한층 업그레이드 가능
  • 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 유지되지 않게 설정이 가능함
  • 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋음
  • 동접자 수가 많은 웹 사이트인 경우 서버에 과부하를 주게 되므로 성능 저하의 요인이 됨
    • 이를 보안하기 위해 만든 토큰 기반의 인증 방식 **JWT (JSON Web Token)**

Session의 문제점

  • scale out server는 세션 저장소가 없어 세션 ID를 기존 서버에 요청해야 함
  • 이것은 http 장점이라고 할 수 있는 stateless 위배
    • stateless
      • 서버가 클라이언트의 세션 상태 및 세션 정보를 저장하지 않는 네트워크 프로토콜
      • 즉, 요청에 대한 응답만 처리하는 방식
      • 각 통신은 선행되거나 후속으로 따라오는 통신과 관련이 없음
      • 클라이언트가 송신하려 했던 모든 데이터가 서버쪽에 수신 되었는지 확인하지 않음
  • 세션 저장소라는 곳에 세션 ID를 저장하는 상황이기 때문에 stateful
    • stateful의 단점
      • 서버 상태를 저장해야하기 때문에 서버를 늘릴 경우 scale out server 에 로그인 정보를 중복 저장해야 함
      • 결국 중앙 세션 저장소를 따로 만들어 문제를 해결함
  • 세션 저장소 문제가 발생하면 인증 체계가 무너짐 → 이전 다른 인증된 유저 또한 인증 불가
  • 세션 저장소가 필수적으로 존재 → 비용 문제
  • 세션 ID가 탈취 되었을 경우 대체는 가능하나 클라이언트인척 위장하는 보안에 약점 존재
  • 사용자가 많아질 수록 메모리 차지
  • “매번 요청”시 세션 저장소 조회해야하는 단점 존재
  • 저장위치
    • 쿠키는 클라이언트 (브라우저)에 메모리 또는 파일에 저장
    • 세션은 서버 메모리에 저장
  • 보안
    • 쿠키는 클라이언트 로컬에 저장되기도 하고 특히 파일로 저장되는 경우 탈취나 변조될 위험이 있음
    • 쿠키는 request/response에서 스나이핑 당할 위험이 있어 보안이 비교적 취약
    • 반대로 session은 클라이언트 정보 자체는 서버에 저장되어 있으므로 비교적 안전
  • 라이프 사이클
    • 쿠키는 앞서 설명한 지속 쿠키의 경우에 브라우저를 종료하더라도 저장되어 있을 수 있음
    • 세션은 서버에서 만료시간 / 날짜를 정해서 지워버릴 수 있음
    • 세션은 세션 쿠키에 세션 아이디를 정한 경우 브라우저 종료시 세션아이디가 날아갈 수 있음
  • 속도
    • 쿠키에 정보가 있기 때문에 서버에 요청시 헤더를 바로 참조하면 됨 → 속도에서 유리
    • 세션은 제공받은 세션 아이디를 이용해서 서버에서 다시 데이터를 참조 → 비교적 느릴 수 있음

그럼 Cookie는 왜 사용할까?

  • 세션은 서버에 데이터를 저장 즉, 서버의 자원을 사용함
  • 서버 자원에 한계가 있고 메모리를 사용하다보면 속도 저하도 올 수 있기 때문
profile
github : https://github.com/kiaeh2323 , email : kiaeh9269@gmail.com

0개의 댓글