AnbyMata의 해킹 노트

[THM] HTTP in Detail - EP.2 (Task 5~7). 完 본문

TryHackMe/Web & Networks 기초

[THM] HTTP in Detail - EP.2 (Task 5~7). 完

AnbyMata 2026. 1. 14. 22:00

TryHackMe - "HTTP in Detail". Task 5~7. Write-up + Extra Study!

출처: https://tryhackme.com/room/httpindetail

 

HTTP in Detail

Learn about how you request content from a web server using the HTTP protocol

tryhackme.com

 

[5]  Headers

Headers = 웹 서버에 request를 보낼 때 함께 전송할 수 있는 추가 데이터

 

 

[5-1] Common Request Headers

1. Host

 - 하나의 웹 서버가 여러 웹 사이트를 호스팅하는 경우, Host 헤더를 사용해 어떤 웹 사이트를 요청하는지 서버에 알려줌

 - Host 헤더가 없거나 명시되지 않으면, 서버의 기본 (Default) 웹사이트를 받게 됨

[보충 설명]
Host 헤더는 Virtual Hosting (가상 호스팅) 때문에 필요합니다.
Virtual Hosting은 하나의 웹 서버/IP로 여러 개의 웹 사이트 (도메인)을 운영하는 기술입니다. (IP = 서버 라고 이해하세요)
IP address(주소)는 한정되어 있기 때문에, IP를 적게 사용하기 위해서 IP 하나 + 여러 도메인 구조를 사용합니다.
즉, IP가 같더라도 Host 값이 다르다면 다른 사이트를 제공해줍니다.
이 점 때문에 Host 헤더 조작Virtual Host 기반 취약점 테스트에서 자주 사용됩니다.

 

2. User-Agent

 - 사용 중인 브라우저 종류와 버전을 서버에 알려줌

 - 서버는 이를 기반으로 브라우저에 맞게 웹 사이트를 구성함

 - 일부 HTML, JS, CSS 요소는 특정 브라우저에서만 동작

[보충 설명]
브라우저는 Google의 Chrome, Mozilla의 Firefox, Microsoft의 Edge, Apple의 Safari, Naver의 Whale 등을 말합니다.
우리가 흔히 사용하는 Naver, Google 같은 검색 엔진들은 브라우저 내에서 실행되는 웹 사이트입니다.
즉, Naver, Google은 브라우저는 아닙니다.

HTML, CSS, JS는 웹 프로그래밍에서 사용되는 코드들로 웹 사이트를 구성하고 있습니다.
즉, 서버가 브라우저 호환성을 판단하기 위해 일부 요소는 특정 브라우저에서만 작동합니다.

 

3. Content-Length

 - Form 데이터처럼 서버로 데이터를 보낼 때, request에 얼마나 많은 데이터가 들어있는지 서버에 알려줌

 - 이를 통해 서버의 데이터 수신 완료 여부를 판단함 (= 값이 틀리면 request에 오류가 있다고 판단)

 

4. Accept-Encoding

 - 브라우저가 지원하는 압축 방식을 서버에 알려줌

 - 전송 데이터를 더 작게 만들 수 있도록 함 → 전송 속도 개선

 

5. Cookie

 - 사용자의 정보를 기억하기 위해 서버로 전송되는 데이터

 - 덕분에 로그인 상태를 유지하며 세션(session) 유지

 - 웹 해킹에서 매우 중요!

[보충 설명]
우리가 로그인을 한 뒤에도 다른 페이지로 이동할 수 있는 이유는,
로그인 상태를 유지하기 위해 필요한 정보가 계속 전달되기 때문입니다.
이 필요한 정보는 Cookie에 저장됩니다.

이 정보가 없으면,
페이지를 이동하는 순간, 서버는 사용자를 로그인하지 않은 상태로 인식합니다.

 

 

[5-2] Common Response Headers

1. Set-Cookie

 - Client에 저장할 정보를 지정함

 - Request마다 서버로 다시 전송됨

 - 즉, 서버가 Cookie를 생성/갱신할 때 사용

 

2. Cache-Control

 - 브라우저의 cache에 response(응답) 내용을 얼마나 오래 저장할지를 지정함

 - 저장 시간을 지정함으로 성능을 최적화 시킴

 

3. Content-Type

 - 서버가 반환하는 데이터의 형식

 - 이를 바탕으로 브라우저는 데이터 처리 방식을 결정함

 

4. Content-Encoding

 - 전송 데이터를 작게 만들기 위해 사용된 압축 방식을 나타냄

 - Accept-Encoding 내용에 대한 서버의 응답 결과

 

 


[6]  Cookies

Cookies = 사용자의 컴퓨터 (=브라우저)에 저장되는 작은 데이터 조각

- 웹 서버로부터 'Set-Cookie' Header를 받을 때 저장됨 (브라우저가 자동 저장함)

- 이후 모든 Request에서 브라우저는 Cookie 데이터를 다시 웹 서버로 전송함

- 일반적으로 웹 사이트 authentication(인증)에 사용됨

 

Cookies가 필요한 이유

- HTTPstateless protocol = 이전 요청을 기억하지 않음

- Cookies를 사용해 웹 서버에 사용자가 누구인지, 개인 설정, 예전 방문 여부 등을 알려줄 수 있음

- 즉, 로그인 상태를 유지시켜주는 역할

[보충 설명]
로그인 시 브라우저는 서버에게 아이디와 비밀번호를 보내 인증을 요청합니다.
로그인에 성공하면, 서버는 브라우저에게 Cookie 값 (session 식별자)을 보내고 브라우저는 이 session 값을 저장합니다.
이후, 브라우저는 모든 request마다 session 값을 Header에 포함하여 보냄으로 서버에게 로그인한 사용자임을 알려줍니다.
즉, Cookie != 아이디/비밀번호

 

 

 

[6-1] HTTP Request 예시

1)  첫 페이지 요청 (GET Request)

 - 브라우저가 웹 페이지를 요청

 - 아직 Cookie 없음 = 서버는 사용자가 누구인지 모름

GET / HTTP/1.1
Host: anbymata.com
User-Agent: ????

 

 

2)  서버 Response(응답) → Form 제공

 - 단순 HTML 페이지

 - 사용자 이름을 입력받는 폼이 있음

HTTP/1.1 200 OK
Server: ?????
Date: ????
Content-Type: text/html; charset=UTF-8

...

 

 

3)  Form 제출 (Post Request)

 - 사용자가 사용자 이름 (아이디)를 입력 (name=anby)

 - 브라우저가 서버로 데이터 전송

POST / HTTP/1.1
Host: anbymata.com
User-Agent: ????
Content-Type: application/x-wwwform-urlencoded
Content-Length: 9

name=anby

 

 

4)  서버가 Cookie 설정 (Set-Cookie)

 - 서버가 사용자가 "anby"임을 인지

 - 'Set-Cookie'로 사용자 정보를 Cookie에 저장하라고 브라우저에게 지시

HTTP/1.1 200 OK
Server: ?????
Date: ????
Set-Cookie: name=anby
Content-Type: text/html; charset=UTF-8

...

 

 

5)  이후 Request(요청) (Get + Cookie)

 - 브라우저는 자동으로 Cookie를 포함하여 요청함

GET / HTTP/1.1
Host: anbymata.com
User-Agent: ????
Cookie: name=anby

 

 

6)  Cookie를 통해 사용자를 식별한 서버의 응답

 - 사용자 정보를 알기에 입력 Form 페이지를 보여주지 않음

 - 비유하면, 로그인된 상태라 아이디와 비밀번호를 입력하는 페이지를 안 보여주는 느낌

HTTP/1.1 200 OK
Server: ?????
Date: ????
Content-Type: text/html; charset=UTF-8

<html><body>Welcome anby!</body></html>

 - 입력 Form 대신 "Welcome anby!"라는 텍스트가 출력되는 페이지

 

 

 

[6-2] Cookies 확인하기

(Naver Whale 환경 기준)

 

1)  F12 키를 눌러 개발자 도구 열기

F12 키 누르기

 

 

2)  'Network' 탭 클릭

'Network' 탭

 

 

3)  각 요청을 클릭해보면서 상세 정보 확인하기

 = 보통 보안을 위해서 Cookie 값들이 암호화되어 있습니다.

 

 

 


[7]  Making Requests

0. 기본 정보

- 서버에 "tryhackme.com" 웹 사이트를 요청하고 있습니다.

- 1) 좌측 상단의 'GET' 부분을 클릭해 원하는 메서드로 변경 (GET, POST DELETE 등..)

- 2) "http://tryhackme.com/" URL 뒤에 이동하고자 하는 페이지 입력

  + "/example" 페이지로 이동한다고 하면, "http://tryhackme.com/example"로 URL 완성

- 3) 톱니바퀴 아이콘을 눌러 원하는 파라미터(parameter) 입력 (필요하다면)

  + 'key : value' 쌍으로 구성됨. [6-1]에서의 "user=anby"를 생각해보면 됨 (user : anby)

- 4) GO 버튼을 눌러 Request 전송

 

아래 내용을 보기 전, TryHackMe 사이트에서 실습해보세요! 

 

 

1. '/room' 페이지에 GET Request 보내기

 - GET = 웹 서버로부터 정보를 가져오는 method(메서드)

 - 즉, '/room' 페이지에 대한 정보를 가져옴

GET /room HTTP/1.1

 

 

 

2. id 패러미터(parameter)를 '1'로 설정하여 '/blog' 페이지에 GET Request 보내기

 - 먼저 id 패러미터 값을 '1'로 설정

id : 1

 

 - '/blog' 페이지에 "id:1"을 포함한 GET Request 보내기

 - 즉, 'id=1'인 '/blog' 페이지에 대한 정보를 가져옴

GET /blog?id=1 HTTP/1.1

 

 

 

3. '/user/1' 페이지에 DELETE Request 보내기

 - DELETE = 웹 서버의 정보나 레코드를 삭제하는 method(메서드)

 - 즉, '/user/1' 페이지를 삭제

DELETE /user/1 HTTP/1.1

 

 

 

4. username 패러미터(parameter)를 'admin'로 설정하여 '/user/2' 페이지에 PUT Request 보내기

 - PUT = 웹 서버의 기존 정보를 수정/업데이트하는 method(메서드)

 - 먼저, username 패러미터 값을 'admin'으로 설정

username : admin

 

 - '/user/2' 페이지에 "username:admin"을 포함한 PUT Request 보내기

 - 즉, '/user/2' 페이지의 username 값을 "admin"으로 변경

PUT /user/2 HTTP/1.1 + 'username=admin'

 

 

 

5. username은 'thm', password는 'letmein'으로 설정하여 '/login' 페이지에 POST Request 보내기

 - POST = 웹 서버에 데이터를 보내거나 새로운 데이터나 레코드를 생성하는 method(메서드)

 - 먼저, username은 'thm', password는 'letmein'으로 설정

username : thm + password : letmein

 

 - '/login' 페이지에 "username:thm", "password:letmein"을 포함한 POST Request 보내기

 - 즉, '/login' 페이지에 "username=thm", "password=letmein"이란 데이터를 보냄

POST /login HTTP/1.1 + 'username=thm&password=letmein'

 

 


[TryHackMe] HTTP in Detail - EP.2 (Task 5~7). END.

 

[TryHackMe] HTTP in Detail. Finish!