본문 바로가기
정보보안/모의해킹

[웹 해킹] 웹 해킹 (5)- 웹 기초 [쿠키 / 세션 / 세션 하이재킹 ]

by 용오동 2025. 1. 21.
반응형


[쿠키(Cookie) 🍪]

♣ HTTP 프로토콜의 특징

> Connectionless : 하나의 요청에 하나의 응답을 한 후 연결을 종료하는 것을 의미한다. 특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새로운 요청이 있을 때마다 항상 새로운 연결을 맺는다.

> Stateless : 통신이 끝난 후 상태 정보를 저장하지 않는 것을 의미한다. 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없다.

♣ 클라이언트의 IP 주소와 User-Agent는 매 번 변경될 수 있는 정보이면서, HTTP 프로토콜의 'Connectionless'와 'Stateless' 특징 때문에 웹 서버는 클라이언트를 기억할 수 없다.

♣ 이와 같이 Connectionless, Stateless 특성을 갖는 HTTP에서, 상태를 유지하기 위해 쿠키(Cookie)가 탄생하게 되었다. 

쿠키(Cookie) : 쿠키는 키(Key) 값(Value)로 이루어진 일종의 단위로, 서버가 클라이언트에게 쿠키를 발급하면, 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 같이 전송한다. 서버는 클라이언트의 요청에 포함된 쿠키를 확인하여 클라이언트를 구분할 수 있게 된다.

 쿠키의 용도는 클라이언트의 정보 기록상태 정보를 표현하는 용도로 사용한다.

♣ 웹 서비스를 사용하면서 팝업창에 [다시 보지 않기], [7일 간 표시하지 않기] 버튼이 있는 것을 확인한 적이 있을 것이다. 웹 서버는 각 클라이언트의 팝업 옵션을 기억하기 위해 쿠키에 해당 정보를 기록하고, 쿠키를 통해 팝업 창 표시 여부를 판단한다. 

✳️ 과거에는 클라이언트의 정보를 저장하기 위해 쿠키가 종종 사용되었다. 쿠키는 서버와 통신할 때마다 전송되기 때문에 쿠키가 필요 없는 요청을 보낼 때 리소스 낭비가 발생할 수 있다. 그래서 최근에는 이러한 단점을 보완하기 위해 'Modern Storage APIs'를 통해 데이터를 저장하는 방식을 권장하고 있다.

♣ 많은 웹 사이트에서는 회원 가입과 로그인을 통해 개인 맞춤형 서비스를 제공한다. 웹 서버에서는 수많은 클라이언트의 로그인 상태와 이용자를 구별하기 위해 쿠키를 사용한다. 이 때, 클라이언트를 식별할 수 있는 값을 쿠키에 저장해 사용한다.

♣ 쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보이다. 따라서, 악의적인 의도를 가진 클라이언트는 쿠키 정보를 변조하여 서버에 요청을 보낼 수 있다. 만약 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면, 공격자가 타 이용자를 사칭하여 정보를 탈취할 수 있게 된다.


[쿠키가 없는 통신 🍪]

♣ 쿠키 없이 HTTP 통신을 하는 경우, 서버는 요청을 보낸 클라이언트가 누군지 구분할 수 없기 때문에 현재 어떤 클라이언트와 통신하는지 알 수 없다


[쿠키가 있는 통신 🍪]

♣ 쿠키를 사용한 HTTP 통신은 아래 그림과 같이 이루어진다. 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 포함하고, 서버는 해당 쿠키를 통해 클라이언트를 식별하게 된다.


[쿠키 변조 및 데이터 탈취]

쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보이다. 따라서, 악의적인 의도를 가진 클라이언트는 쿠키 정보를 변조하여 서버에 요청을 보낼 수 있다. 만약 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면, 공격자가 타 이용자를 사칭하여 정보를 탈취할 수 있게 된다.


[세션(Session)]

♣ 웹 통신에서 클라이언트가 쿠키를 변조해 서버에 요청을 보낼 수 있다. 따라서, 쿠키에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해서 세션(Session)을 사용하게 된다.

세션(Session) : 세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는를 만들어 클라이언트에 전달하는 방식으로 작동한다. 이때 키(Key)는 유추할 수 없는 랜덤한 문자열로 구성되어야 하며, 해당 키를 Session ID라고 한다. 브라우저는 해당 키를 쿠키에 저장하고, 이후에 HTTP 요청을 보낼 때 사용한다. 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인한다. 아래 그림은 세션 동작의 예시이다.


[쿠키 적용법]

쿠키는 클라이언트에 저장되기 때문에 클라이언트는 저장된 쿠키를 조회, 수정, 추가할 수 있다. 클라이언트가 서버에 요청을 보낼 때 저장된 쿠키를 요청 헤더에 넣어 전송하기 때문에 요청을 보낼 때 쿠키 헤더를 변조할 수 있다.

쿠키를 설정할 때는 만료 시간을 지정할 수 있고, 만료 시간 이후에는 클라이언트에서 쿠키가 삭제된다. 쿠키의 만료는 클라이언트(브라우저)에서 관리된다.

 쿠키는 서버와 클라이언트 양 측 모두 설정할 수 있다. 설정하는 방법은 아래와 같다.

 > 서버 : HTTP 응답 중 헤더에 쿠키 설정 헤더(Set-Cookie)를 추가하면 클라이언트의 브라우저가 쿠키를 설정한다.

HTTP/1.1 200 OK
Server: Apache/2.4.29 (Ubuntu)
Set-Cookie: name=test;
Set-Cookie: age=30; Expires=Tue, 21 Jan 2025 23:21:50 GNT;
...

 

> 클라이언트 : 자바스크립트를 사용해 쿠키를 설정한다.

document.cookie = "name=test;"
document.cookie = "age=30; Expires=Tue, 21 Jan 2025 23:21:50 GMT;

크롬 개발자 도구의 [Console] 탭과 [Application] 탭을 활용하여 쿠키를 열람할 수 있다.

> 크롬 페이지에서 F12버튼을 눌러 개발자 도구를 연다. [Console] 탭을 누르고, "document.cookie"를 입력하면 쿠키 정보를 확인할 수 있다. (쿠키 옵션(HttpOnly)에 따라 자바스크립트에서 쿠키 확인이 불가능 할 수 있다.)

> 크롬 개발자 메뉴의 [Application] 탭에서 나열된 목록 중 "Cookie"를 펼치면 Origin 목록을 확인할 수 있다. [Origin]을 누르면 설정된 쿠키 정보를 확인하고 수정할 수 있게 된다.

  쿠키에는 사용자의 세션 정보가 저장되어 있고, 서버는 이를 통해 이용자를 식별하고 인증을 처리한다. 공격자가 이용자의 쿠키를 훔칠 수 있게 된다면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있게된다. 이를 세션 하이재킹(Session Hijacking)이라고 한다.


반응형