> For the complete documentation index, see [llms.txt](https://docs.cooku222.kr/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.cooku222.kr/security/web-hacking/portswigger/web-cache-deception-1.md).

# Web Cache Deception (1)

**웹 캐시**란?

* **원본 서버와 사용자 사이에 위치하는 시스템**이다. 클라이언트가 요청하면 먼저 캐시로 요청이 전달된다. 만약 캐시가 요청 받은 자원을 가지고 있지 않으면 요청은 원본 서버로 전달되고 원본 서버가 요청을 처리하여 응답한다. 이 응답은 사용자에게 보내지기 전에 먼저 캐시로 전송된다. 캐시는 미리 설정된 큐칙에 따라 해당 응답을 저장할지 여부를 결정한다.

<figure><img src="https://blog.kakaocdn.net/dna/cwZkSc/dJMcahiBNLa/AAAAAAAAAAAAAAAAAAAAABE5hUqhrAxLSj-CXmypeckAA5PjgeC-S0wyeXJlYa7e/img.png?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&#x26;expires=1782831599&#x26;allow_ip=&#x26;allow_referer=&#x26;signature=5o%2FGYswAVGrK5BbzKMu220pwb6w%3D" alt="" height="242" width="895"><figcaption><p>web cache</p></figcaption></figure>

* 콘텐츠 전송 네트워크는 사용자에게 가장 가까운 서버에서 콘텐츠를 제공하여 데이터가 이동하는 거리를 최소화해준다. 이로써 전송 속도를 높이고 로드 시간을 단축한다.

캐시 키란?

* 캐시가 HTTP 요청을 수신하면 직접 제공할 수 있는 응답이 있는지 아니면 원본 서버로 요청을 전달해야 하는지 결정해야한다. 캐시는 HTTP 요청의 구성 요소들을 사용해 캐시 키를 생성한다. 일반적으로 캐시 키에는 URL 경로와 쿼리 매개변수가 포함되지만 헤더나 콘텐츠 유형과 같은 다른 요소들도 포함될 수 있다.&#x20;
* 만약 들어오는 요청의 캐시 키가 이전 요청의 캐시 키와 일치하면, 캐시는 두 요청을 동일한 것으로 간주하고 캐시된 응답의 사본을 제공한다. 예시로 캐시 키를 조작해 캐시에 악성 콘텐츠를 주입하는 웹 캐시 포이즈닝 기법이 있다.&#x20;

캐시 규칙이란?

* 캐시 규칙은 무엇을 얼마나 오랫동안 보관할지 결정합니다. static resources들을 저장하도록 설정되며 자주 변경되지 않고 여러 페이지에서 재사용되는 요소들이기 때문입니다. 반면 dynamic content는 민감한 정보를 포함할 가능성이 높기 때문에 캐시되지 않으며 이를 통해 사용자가 서버에서 직접 최신 데이터를 받을 수 있도록 보장합니다.

**웹 캐시 디셉션**이란?

* 이러한 캐시 규칙이 적용되는 방식을 악용한다. 정적 파일 확장자 규칙은 요청된 리소스의 파일 확장자와 일치하는지 확인하는 규칙으로 자바스크립트 파일의 경우 .js로 작성되었는지가 이에 해당한다. 정적 디렉터리 규칙은 특정 접두사(prefix)로 시작하는 모든 URL 경로와 일치하는지 확인한다. 이 규칙은 주로 /static 이나 /assets와 같이 정적 리소스만 포함하는 디렉터리를 대상으로 할 때 사용된다. 마지막으로 파일 이름 규칙은 robots.txt나 favicon.ico 처럼 웹 운영에 필수적이면서 거의 변경되지 않는 파일들을 대상으로 하기 위해 특정 파일 이름과 일치하는지 확인하는 규칙이다.&#x20;
* 또한 캐시는 URL 매개변수나 동적 분석과 같은 다른 기준을 바탕으로 사용자 정의 규칙을 구현하기도 한다.\
  &#x20;

웹 캐시 디셉션 공격을 구성하려면?

1. 민감한 정보를 포함하는 동적 응답을 반환하는 대상 엔드포인트를 식별한다.
2. 캐시와 원본 서버가 URL 정보를 해석하는 방식이 일치하는지 여부를 식별한다.
   1. URL을 리소스에 매핑하는 방식
   2. 구분자 문자를 처리하는 방식
   3. 경로를 정규화하는 방식

3\. 캐시가 동적 응답을 저장하도록 속이는 악성 URL을 제작한다.\
&#x20;\
캐시 버스터 사용하기

* 전송하는 각 요청이 서로 다른 캐시 키를 갖도록 해야한다. 그렇지 않으면 이미 캐시된 응답을 받게 되어 결과가 다르게 나올 수 있다. 일반적으로 URL 경로와 쿼리 매개변수가 모두 캐시 키에 포함되므로 경로에 쿼리 문자열을 추가하고 요청을 보낼 때마다 이를 변경함으로써 키를 바꿀 수 있다.&#x20;
* Param Miner 확장 기능을 설치해 이 과정을 자동화할 수도 있다.

캐시된 응답 탐지하기

* 테스트 중에는 캐시된 응답을 식별할 수 있는 것이 중요한데, 응답 헤더와 응답 시간으로 확인할 수 있다.&#x20;

X-Cache 헤더는 응답이 캐시에서 제공되었는지에 대한 정보를 제공한다.&#x20;

* X-Cache : hit 는 응답이 캐시에 제공되었다를 의미

* X-Cache : miss 는 캐시에 해당 요청 키에 대한 응답이 없어 원본 서버에서 가져왔다는 의미이다. 대부분의 경우 가져온 응답은 이후 캐시된다. 이를 확인하려면 요청을 다시 보내 값이 hit로 변경되는지 확인한다.

* X-Cache : dynamic은 원본 서버가 콘텐츠를 동적으로 생성한다는 의미이다. 해당 응답이 캐싱에 적합하지 않음을 의미한다.&#x20;

* X-Cache : refresh는 캐시된 내용이 오래되어 갱신하거나 재검증해야한다는 의미이다.&#x20;

* Cache-Control 헤더에는 max-age가 0보다 큰 public과 같이 캐싱을 나타내는 지시자가 포함될 수 있다. 해당 리소스가 캐시 가능함을 의미하고 캐시가 실제로 되는지와는 상관이 없다는 점을 유의해야한다.&#x20;

***

{% embed url="<https://portswigger.net/web-security/learning-paths/web-cache-deception/wcd-web-caches/web-cache-deception/web-caches>" %}

\[\\

<br>]\(<https://portswigger.net/web-security/learning-paths/web-cache-deception/wcd-web-caches/web-cache-deception/web-caches&#xD;&#xA;&#xD;&#xA;>)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.cooku222.kr/security/web-hacking/portswigger/web-cache-deception-1.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
