TeamH4C

[빡공팟 5기] W4 : Web Hacking 로드맵 - STAGE 2 - 2

이유갬 2022. 10. 13. 20:45

Background : Cookie & Session

 

웹 서버는 어떻게 많은 클라이언트들을 구별하고 서비스를 제공하는것일까?

HTTP 프로토콜로 웹 서버와 통신할 때

웹 서버에게 명령을 내리기 위해 GET, POST 등과 같은 메소드와 자원의 위치를 가리키는 URL 등이 포함되어 있다.

헤더를 통해서 웹 서버에게 요청을 보내고 웹 서버는 헤더를 읽고 결과 값을 클라이언트에게 반환한다.

이때, 헤더는 클라이언트의 정보와 요청 내용을 구체화하는 데이터가 포함되어 있다. -> 클라이언트의 인증 정보 또한 포함 가능함.

 

클라이언트의 IP 주소와 User-Agent 는 매번 변경될 수 있는 고유하지 않은 정보이다.

또한, HTTP 프로토콜의 Coneectionless, Stateless 특징 때문에 웹 서버는 클라이언트를 기억할 수 없다.

따라서, HTTP 에서 상태 유지를 위해 쿠키(Cookie)가 탄생했다.

 

1. 쿠키

쿠키는 Key : Value 로 이루어진다.

서버가 클라이언트에게 쿠키를 발급하면, 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 같이 전송한다.

서버는 클라이언트의 요청에 포함된 쿠키를 확인해 클라이언트를 구분할 수 있다.

쿠키는 정보 기록상태 정보를 저장한다.

 

1 - 1. 정보 기록

웹 서비스 사용 시 팝업 창에 "다시 보지 않기", "7일 간 표시하지 않기" 등이 있는 것을 확인 할 수 있다.

웹 서버는 각 클라이언트의 팝업 옵션을 기억하기 위해 쿠키에 해당 정보를 기록하고 쿠키를 통해서 팝업 창 표시 여부를 판단한다.

쿠키는 서버와 통신할 때마다 전송되기 때문에 쿠키가 필요 없는 요청을 보낼 때 리소스 낭비가 발생할 수 있다.

최근에는 이러한 단점을 보완하기 위해서 Modern Storage APIs 를 통해 데이터를 저장하는 방식을 권장하고 있다.

 

1- 2. 상태 정보

많은 웹 사이트에서는 회원 가입과 로그인을 통해 개개인에게 맞춤형 서비스를 제공한다.

이때 클라이언트를 식별 할 수 있는 값을 쿠키에 저장해서 사용한다.

따라서, 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있다.

만약 서버가 별다른 검증 없이 쿠키를 통해 이용자 인증 정보를 식별하면 공격자는 타 이용자를 사칭해 정보 탈취가 가능하다.

 

2. 세션

쿠키에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 세션을 사용한다.

세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키를 만들어 클라이언트에게 전달한다.

해당 키를 Session ID 라고 한다.

브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용한다.

서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인한다.

 

쿠키는 클라이언트에 저장되기 때문에 클라이언트는 저장된 쿠키를 조회, 수정, 추가할 수 있다.

클라이언트가 서버에 요청을 보낼 때 저장된 쿠키를 요청 헤더에 넣어 전송하므로 이용자가 요청 보낼 때 쿠키 헤더 변조를 할 수 있다.

쿠키 설정할 때는 만료 시간 지정이 가능하고 이후에는 클라이언트에서 쿠키가 삭제된다.

쿠키의 만료는 클라이언트(브라우저)에서 관리 된다.

 

+) 쿠키는 서버와 클라이언트 둘 다 설정할 수 있다.

 

서버

 

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

쿠키 옵션(HttpOnly)에 따라서 자바스크립트에서 쿠키 확인이 불가능 할 수도 있다.

쿠키에는 우리들의 세션 정보가 저장되어 있고 서버는 이를 통해 이용자 식별하고 인증을 처리한다.

공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있는데, 이를 세션 하이재킹(Session Hijacking) 이라고 한다.

 

Exercise : Cookie

- 이 코드의 문제점은 사용자의 요청에서 쿠키값을 그대로 username 에 대입한다는 것이다.

 

쿠키는 클라이언트의 요청에 포함되는 정보로 이용자가 임의로 조작할 수 있다.

서버는 별다른 검증 없이 이용자 요청에 포함된 쿠키를 신뢰하고, 이용자 인증 정보를 식별하기 때문에 공격자는 쿠키에 타 계정 정보를 삽입해 계정을 탈취할 수 있다.

이러한 문제점은 세션을 사용해 해결 할 수 있다.

세션은 인증 정보를 서버에 저장하고, 랜덤한 키를 클라이언트에게 발급한다.

클라이언트는 해당 키를 포함해 서버에게 요청하고, 서버는 저장한 세션 키와 대응하는 클라이언트인지 확인하므로 안전한 서비스 구현이 가능하다.