728x90
X-Requested-With 헤더란
- X-Requested-With 헤더는 주로 웹 애플리케이션에서 AJAX (Asynchronous JavaScript and XML) 요청임을 서버에 알리기 위해 사용
- 즉, 이 헤더가 포함된 요청은 일반적인 웹페이지 전체를 불러오는 것이 아니라, 페이지의 특정 부분만 동적으로 업데이트하기 위해 전송되었음을 의미
- 활용예시: 사용자가 웹사이트의 '더 보기' 버튼을 클릭하거나, 스크롤을 내려 새로운 콘텐츠(예: 뉴스 기사, 상품 목록)를 로드
AJAX 정상적인 통신 흐름 예시
아래는 X-Requested-With: XMLHttpRequest 헤더가 정상적으로 사용되는 대표적인 시나리오입니다.
1. 사용자 행동: 사용자가 웹사이트의 '더보기' 버튼을 클릭하거나, 스크롤을 내려 새로운 콘텐츠(예: 뉴스 기사, 상품 목록)를 로드하려고 합니다.
2. 클라이언트 요청 (JavaScript):HTTP
- 사용자의 브라우저에 내장된 JavaScript 코드가 실행됩니다.
- 이 코드는 서버로 비동기 HTTP 요청을 생성합니다. 이때, 요청 헤더에 X-Requested-With: XMLHttpRequest를 포함시킵니다.
- 이 헤더는 "이 요청은 웹페이지 전체를 새로고침하려는 것이 아니라, JavaScript에 의해 생성된 비동기 요청입니다"라는 것을 서버에 알려주는 깃발 역할을 합니다.클라이언트 요청 (JavaScript):HTTP
- 요청 헤더 예시:
GET /api/articles?page=2 HTTP/1.1 Host: example.com X-Requested-With: XMLHttpRequest Content-Type: application/json
3. 서버 응답: JSON
- 서버는 X-Requested-with 헤더를 보고 이 요청이 AJAX 요청임을 인지합니다.
- 따라서 완전한 HTML 페이지 전체를 보내는 대신, 요청에 필요한 데이터만 간결한 형태(주로 JSON 또는 XML)로 응답합니다.
- 만약 이 헤더가 없다면, 서버는 일반적인 페이지 요청으로 오인하여 불필요한 전체 HTML 코드를 보낼 수도 있습니다.
- 응답 본문 예시 (JSON):
{ "articles": [ {"title": "새로운 기사 1", "author": "김기자"}, {"title": "새로운 기사 2", "author": "이기자"} ] }
4. 클라이언트 처리 (JavaScript):
- 브라우저는 서버로부터 받은 JSON 데이터를 파싱 합니다.
- JavaScript는 이 데이터를 사용하여 현재 페이지의 HTML 구조(DOM)를 동적으로 변경하여 새로운 콘텐츠를 사용자에게 보여줍니다. 이 과정에서 페이지 새로고침은 발생하지 않습니다.
정탐/악성 판단을 위한 핵심 체크리스트
1. 헤더 값 자체의 형태
- ✅ 정상 (정탐): 헤더 값이 거의 항상 XMLHttpRequest라는 표준적인 문자열입니다. 이는 jQuery, Axios 등 대부분의 표준 라이브러리가 자동으로 붙여주는 값입니다.
GET /api/posts/next?current=123 HTTP/1.1 Host: my-blog.com X-Requested-With: XMLHttpRequest Accept: application/json
- ❌ 비정상 (악성 의심): F5 문서의 WireX 악성코드처럼, 값이 asdfg, 12345 등 의미 없는 무작위 문자열이거나 아예 비어있다면, 이는 정상적인 라이브러리를 통해 생성된 요청이 아닐 가능성이 매우 높습니다.
GET /?query=attack HTTP/1.1 Host: target-server.com X-Requested-With: asjdfk234 User-Agent: Mozilla/5.0
2. 요청에 담긴 데이터 (Payload)의 내용
- ✅ 정상 (정탐): 요청에 담긴 데이터가 서비스의 기능에 부합합니다. 예를 들어, '2페이지 더 보기' 요청에 {"page": 2} 와 같이 예상 가능한 정상적인 값이 들어있습니다.
POST /api/search HTTP/1.1 Host: nice-shop.com X-Requested-With: XMLHttpRequest Content-Type: application/json {"query": "노트북", "page": 2, "sort": "price_asc"}
- ❌ 비정상 (악성 의심): 데이터가 비정상적이거나 공격 시도로 보입니다.
- 수량 조작: {"quantity": -99} 처럼 논리적으로 말이 안 되는 값
- SQL 인젝션: {"id": "1' OR '1'='1"} 과 같은 공격 구문
- 데이터 부재: 데이터를 보내야 하는 요청인데 아무 데이터도 없는 경우
POST /api/v1/login HTTP/1.1 Host: insecure-bank.com X-Requested-With: XMLHttpRequest Content-Type: application/json {"user_id": "admin' OR '1'='1", "password": "password"}
3. 트래픽의 행동 패턴
- ✅ 정상 (정탐): 사용자의 행동(클릭, 스크롤 등)에 맞춰 필요할 때 한 번씩 요청이 발생합니다. 트래픽 발생 주기가 비규칙적이고 자연스럽습니다.
11:20:05 - GET /api/feed?offset=10 요청 (스크롤) 11:20:12 - GET /api/feed?offset=20 요청 (다시 스크롤) 11:20:19 - POST /api/posts/like 요청 ('좋아요' 클릭)
- ❌ 비정상 (악성 의심):
- 대량 발생 (DDoS): 특정 IP나 여러 IP에서 짧은 시간 동안 동일한 요청이 수백, 수천 건씩 쏟아져 들어옵니다.
- 규칙적인 발생: 사람의 행동이라고 보기 어려울 정도로 1초에 한 번씩 정확하게 요청이 계속 발생합니다.
11:22:01.100 - POST /api/login ({"user":"a","pass":"1234"}) 11:22:01.200 - POST /api/login ({"user":"b","pass":"1234"}) 11:22:01.300 - POST /api/login ({"user":"c","pass":"1234"})
4. 요청이 도달하는 주소 (API Endpoint)
- ✅ 정상 (정탐): 요청이 도달하는 URL 주소가 실제로 AJAX 통신을 사용하도록 개발된 유효한 API 주소입니다. (예: /api/comments, /ajax/load_more)
GET /api/v2/mail/unread-count HTTP/1.1 Host: my-mail-service.com X-Requested-With: XMLHttpRequest
- ❌ 비정상 (악성 의심): AJAX 기능이 전혀 없는 엉뚱한 주소(예: /main.html, /images/logo.png)로 해당 헤더를 포함한 요청이 들어옵니다. 이는 서버가 어떻게 반응하는지 떠보려는 스캐닝 공격일 수 있습니다.
GET /static/css/main.css HTTP/1.1 Host: some-website.com X-Requested-With: XMLHttpRequest
참고자료
Wirex Android DDoS Malware Adds UDP Flood
As quickly as attackers commandeer IoT devices to build more “thingbots,” they continue to evolve their attack types and functionality.
www.f5.com
728x90