무작정 해킹 공부/Web Hacking
Cookie & Session
startonebyone
2022. 7. 25. 00:16
Cookie
- 클라이언트의 IP 주소와 User-Agent는 매번 변경될 수 있는 고유하지 않은 정보일 뿐만 아니라, HTTP 프로토콜의 Connectionless와 Stateless 특징 때문에 웹 서버는 클라이언트를 기억할 수 없다.
- 쿠키는 Key와 Value로 이루어진 일종의 단위로, 서버가 클라이언트에게 쿠키를 발급하면, 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 같이 전송한다. 서버는 클라이언트의 요청에 포함된 쿠키를 확인해 클라이언트 구분 가능.
- Connectionless : 하나의 요청에 하나의 응답을 한 후 연결 종료. 특정 요청에 대한 연결은 이후의 요청과 이어지지 않고 새 요청이 있을 때마다 항상 새로운 연결을 맺음.
- Stateless : 통신이 끝난 후 상태 정보를 저장하지 않음을 의미. 이전 연결에서 사용한 데이터를 다른 연결에서 요구할 수 없음.
Cookie 용도
- 쿠키는 일반적으로 클라이언트의 정보 기록과 상태 정보를 표현하는 용도로 사용.
- 정보 기록 : 웹 서버는 각 클라이언트의 팝업 옵션을 기억하기 위해 쿠키에 해당 정보를 기록하고, 쿠키를 통해 팝업 창 표시 여부를 판단한다. 쿠키는 Modern Storage APIs를 통해 데이터를 저장하는 방식을 권장함.
- 상태 정보 : 많은 웹 사이트에서는 회원 가입과 로그인을 통해 개개인에게 맞춤형 서비스를 제공한다. 웹 서버에서는 수많은 클라이언트의 로그인 상태와 이용자를 구별해야 하는데, 이때 클라이언트를 식별할 수 있는 값을 쿠키에 저장해 사용한다.
Cookie가 없는 통신
- 서버는 요청을 보낸 클라이언트가 누군지 알 수 없기에 현재 어떤 클라이언트와 통신하는지 알 수 없음.
Cookie가 있는 통신
- 클라이언트는 서버에 요청을 보낼 때마다 쿠키를 포함하고, 서버는 해당 쿠키를 통해 클라이언트를 식별함.
Cookie 변조
- 쿠키는 클라이언트의 브라우저에 저장되고 요청에 포함되는 정보다. 따라서, 악의적인 클라이언트는 쿠키 정보를 변조해 서버에 요청을 보낼 수 있다. 만약 서버가 별다른 검증 없이 쿠키를 통해 이용자의 인증 정보를 식별한다면 공격자가 타 이용자를 사칭해 정보를 탈취할 수 있다.
Session
- Cookie에 인증 상태를 저장하지만 클라이언트가 인증 정보를 변조할 수 없게 하기 위해 세션을 사용한다.
- 세션은 인증 정보를 서버에 저장하고 해당 데이터에 접근할 수 있는 키(유추할 수 없는 랜덤한 문자열)를 만들어 클라이언트에 전달하는 방식으로 작동한다.
- 해당 키를 일반적으로 Session ID라고 한다.
- 브라우저는 해당 키를 쿠키에 저장하고 이후에 HTTP 요청을 보낼 때 사용한다.
- 서버는 요청에 포함된 키에 해당하는 데이터를 가져와 인증 상태를 확인한다.
- 즉, 쿠키는 데이터 자체를 이용자가 저장하며, 세션은 서버가 저장한다는 차이가 있다.
- 쿠키에 포함된 Session ID를 사용해 서버에 저장된 세션 데이터에 접근하는 방식
Cookie 적용법
- 서버 : HTTP 응답 중 헤더에 쿠키 설정 헤더(Set-Cookie)를 추가하면 클라이언트의 브라우저가 쿠키를 설정함.
HTTP/1.1 200 OK |
Server: Apache/2.4.29 (Ubuntu) |
Set-Cookie: name=test; |
Set-Cookie: age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT; |
... |
- 클라이언트 : 자바스크립트를 사용해 쿠키 설정.
document.cookie = "name=test;" |
- document.cookie = "age=30; Expires=Fri, 30 Sep 2022 14:54:50 GMT;"
세션 하이재킹
- 쿠키에는 이용자의 세션 정보가 저장되어 있고 서버는 이를 통해 이용자를 식별하고 인증을 처리한다. 공격자가 이용자의 쿠키를 훔칠 수 있으면 세션에 해당하는 이용자의 인증 상태를 훔칠 수 있는데, 이를 세션 하이재킹이라 한다. 즉, 타 이용자의 쿠키를 훔쳐 인증 정보를 획득하는 공격을 말한다.
로그인을 통해 세션 알아보기
- 로그인 상태 -> 크롬 검사에서 Application -> Cookies -> 사이트 -> sessionid 헤더의 값을 복사 -> Value 값을 삭제하고 새로고침(=>로그아웃 확인 가능)
- 쿠키의 빈 칸을 더블 클릭해 sessionid 헤더 추가 -> 이전에 복사한 세션 값을 Value에 입력 -> 브라우저의 쿠키에 세션 값 설정 완료, 페이지 새로고침 하면 로그인이 되는 것을 확인 가능