Web Hacking - Cookie & Session

웹 서비스는 로그인을 통해 마이페이지, 유로 서비스 등 개인에 해당하는 서비스를 이용한다. 웹 서버는 수많은 클라이언트와 HTTP 프로토콜을 통해 통신하며 손님 / 관리자 등 방문자의 성격에 맞는 서비스를 제공해야한다. 웹 서버는 클라이언트의 인증 정보를 통해 클라이언트들을 구분하는데, 이 정보를 포함하는 것이 Cookie와 Session이다.

클라이언트의 IP 주소, User-Agent은 고유하지 않은 값 (변경될 수 있음)이며, HTTP 프로토콜의 Connectionless와 Stateless 특징 때문에 웹 서버는 클라이언트를 기억할 수 없음

*User-Agent : 사용하는 OS, 버전 등을 포함한 정보이며, 과거에는 브라우저별로 동일한 서비스를 제공하는 역할이, 브라우저의 엔진이 거의 통일화된 현재는 컴퓨터 OS 또는 모바일 디바이스를 구분하는 역할이 대두된다

  • Connectionless : 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것으로, 새 요청이 있을 때마다 항상 새로운 연결을 맺음
  • Stateless : 통신이 끝난 후의 상태 정보를 저장하지 않는 것을 의미하며, 따라서 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없음

이러한 HTTP에서 상태를 유지하기 위해 만들어진 것이 쿠키로, Key와 Value로 이루어진 일종의 단위이다. 서버가 클라이언트에게 쿠키를 발급하면, 클라이언트는 서버에 요청을 보낼 때 쿠키를 함께 전송하고, 서버는 이를 통해 클라이언트를 구분할 수 있다

Cookie의 용도

  1. 세션 관리 (Session management)
    서버에 저장해야할 로그인, 장바구니, 게임 스코어 등의 정보 관리

  2. 개인화 (Personalization)
    테마와 같은 사용자의 세팅

  3. 트래킹 (Tracking)
    사용자의 행동을 기록하고 분석하는 용도

  • 정보 기록
    쿠키는 서버와 통신할 때마다 전송되기에, 쿠키가 필요하지 않은 요청을 보낼 때 리소스 낭비가 발생할 우려가 있어, 최근에는 이러한 단점을 보완하기 위해 Modern Storage APIs를 통한 데이터 저장을 권한다.

    ex ) “다시 보지 않기”, “7일 간 표시하지 않기” 와 같은 팝업 옵션에 대한 정보를 쿠키에 기록하고, 이를 통해 팝업 창 표시 여부를 판단한다.

  • 상태 정보
    수많은 클라이언트의 로그인 상태와, 이용자를 구별하기 위해 클라이언트를 식별할 수 있는 값을 쿠키에 저장하여 사용한다.

Modern Storage APIs : 웹 스토리지 API (localStorage, sessionStorage), IndexedDB

*웹 스토리지


쿠키는 많은 트래픽의 발생 및 보안의 취약성이 존해마여, 유효기간이 만료되면 자동으로 삭제되고, 브라우저의 모든 윈도우가 고유하여 윈도우마다 독립적인 데이터 저장이 불가하다는 단점이 있다. 이에 비해 웹 스토리지는 용량의 제한이 사실상 없다고 볼 수 있으며, 웹 서버에 요청을 보내도 HTTP 헤더에는 포함되지 않기 때문에 네트워크 부하가 감소한다.

Local Storage 보관 기한이 없는 데이터를 저장하는 객체로, 브라우저 탭 또는 창을 닫거나, 컴퓨터를 재부팅해도 데이터가 보존됨 1. 명시적인 삭제 전까지 영구적 보관이 가능
2. 도메인마다 별도의 저장 영역을 생성하며, 다른 윈도우 창을 사용해도 같은 저장 영역 사용
3. 서로 다른 도메인은 도메인마다 생성된 스토리지에 서로 접근 불가
4. 브라우저마다 하나의 저장영역을 지님
Session Storage 하나의 세션만을 위한 데이터를 저장하는 객체로, 사용자가 브라우저 탬이나 창을 닫으면 저장된 데이터가 삭제됨 1. 데이터의 저장 기간이 제한적이며 세션이 종료되면 자동 삭제
2. 각 세션마다 별도의 저장영역을 생성하며, 다른 윈도우 창을 통해 접근하면 서로 다른 저장 영역 사용
3. 브라우저 창마다 하나의 저장영역을 지님


참고 1 : link1 / 참고 2 : link2 / 참고 3 : link3

Cookie 유무에 따른 통신

쿠키 : “이름 = ㅇㅇ”

쿠키 클라이언트 웹 서버
쿠키 X 1. 내 이름은 ㅇㅇ, 비밀번호는 **

2. 내가 보관했던 파일을 보여줘
1. ㅇㅇ이 비밀번호는 **, 너 ㅇㅇ이 맞구나

2. 너 누구야 ?
쿠키 O 1. 내 이름은 ㅇㅇ, 비밀번호는 **

2. “이름 = ㅇㅇ” 내가 보관했던 파일을 보여줘
1. ㅇㅇ이 비밀번호는 **, 너 ㅇㅇ이 맞구나 앞으로 “이름 = ㅇㅇ”이라고 말해줘

2. ㅇㅇ이구나, ㅇㅇ이가 저장한 파일을 보여줄게


Cookie 변조

악의적인 클라인트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있으며, 서버가 별다른 검증 없이 쿠키를 통해 인증 정보를 식별한다면 공격자가 타 이용자를 사칭하여 정보를 탈취할 수 있다

Session

세션(session) : 쿠키에 인증 상태를 저장하지만, 클라이언트가 인증 정보를 변조할 수는 없도록 한다. 쿠키는 데이터를 클라이언트가 보유하며, 세션은 서버가 보유한다는 점에서 핵심적인 차이가 있다

Session ID : 세션은 인증 정보를 서버에 저장하며, 해당 접근할 수 있는 키 (유추 불가능한 랜덤 문자열)을 만들어 클라이언트에 전달한다

쿠키 적용법

쿠키는 클라이언트에 저장되는 정보이기에, 클라이언트는 저장된 쿠키를 조회, 수정, 추가할 수 있으며, 서버에 요청을 보낼 때, 쿠키 헤더를 변조할 수 있다. 쿠키를 설정할 때에는 만료시간을 지정할 수 있으며 만료는 클라이언트(브라우저)에서 관리된다.

- 세션 하이재킹 (Session Hijacking) 공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증상태 또한 훔칠 수 있는데 이와 같이 타 이용자의 쿠키를 훔쳐 인증 정보를 획득하는 공격

실습

  • 드림핵 사이트 쿠키 사용하여 로그인 / 로그아웃 실습