애플리케이션 캐시와 HTTP 캐시 구분하기
Redis, Workers KV와 HTTP 캐시가 자동으로 같은 보장을 갖지는 않습니다. Workers KV는 최종 일관성을 사용해 쓰기가 즉시 모든 곳에 보이지 않습니다. 다음 지시어는 HTTP용이며 애플리케이션 캐시를 단독으로 설정하지 않습니다.
| HTTP 응답 지시어 | 주요 의미 | 한계 |
|---|---|---|
| no-cache | 저장 가능, 재사용 전 검증 필요. | 저장 금지를 뜻하지 않음. |
| no-store | 이 응답을 캐시에 저장하지 않음. | 이전 사본을 자동 삭제하지 않음. |
| private | 공유 캐시에 저장하지 않음. | 인증 규칙이 아님. |
| max-age | 응답의 신선도 유지 기간. | 모든 데이터의 일관성을 보장하지 않음. |
올바른 사람에게 올바른 응답인지 테스트하기
- 리소스, 매개변수, 언어와 권한 범위별 키 차이를 정합니다. 한 계정이 다른 계정의 비공개 응답을 받지 않는지 테스트합니다.
- 최대 경과 시간, 무효화와 수정·삭제 후 동작을 정합니다. 짧은 TTL은 즉시 일관된 읽기를 보장하지 않습니다.
- 동시 만료, 캐시 장애와 원본 장애를 테스트합니다. 필요하면 갱신을 합치고 업무 규칙이 허용할 때만 오래된 응답을 제공합니다.
캐시 적중률 외에도 측정하기
지연, 오류, 원본 부하와 잘못되거나 오래된 응답을 추적합니다. 잔액, 예약 재고와 권한은 공개 카탈로그와 다른 보장이 필요할 수 있습니다. 빠른 캐시가 통제되지 않는 별도 진실의 원천이 되지 않게 합니다.
1차 자료
API 캐싱은 접근 결정 사항을 보존해야 합니다.
키가 요청자의 권한을 무시할 경우 응답 캐시가 잘못된 쿼리를 빠르게 처리할 수 있습니다. 그래프가 공개 객체와 비공개 객체를 결합할 경우 위험이 증가합니다.
- 캐싱하기 전에 공개, 비공개 및 역할 종속 필드를 분류합니다.
- 한 계정으로 응답을 테스트하고 다른 계정으로 요청합니다.
- 권한 또는 데이터 변경 후 결과를 무효화합니다.
1차 자료: OWASP — GraphQL Cheat Sheet. 관련 방법: 실무 가이드 읽기.
캐시 속도와 최신성 함께 측정하기
가상 예시입니다. 고객이나 실제 관측 결과를 나타내지 않습니다.
두 번의 읽기는 모두 빠르지만, 원본이 바뀐 뒤에도 하나는 이전 가용 상태를 보여 줍니다.
- 값, 버전, 읽은 위치, 변경 후 시간을 비교합니다. 시스템 계약에 따라 무효화, 만료, 원본 접근을 시험합니다.
- 데이터가 얼마나 오래되어도 되는지 용도별로 정하고 차이를 감시합니다. 지연 감소만으로 제공 데이터의 일관성을 입증할 수는 없습니다.
1차 자료: IETF — RFC 9111, HTTP Caching. 관련 방법: 실무 가이드 읽기.
방치된 하위 도메인: CNAME 참조를 통제하며 제거
DNS 이름을 통제 중인 리소스에 연결하고 서비스 해제 전에 의존성을 닫습니다.
- 공개 이름, CNAME 체인, 공급자 리소스와 담당자를 기록하고 권한 있는 계정 목록과 DNS를 대조합니다. HTTP 오류, NXDOMAIN 또는 리소스 부재만으로 탈취 가능성을 입증할 수 없습니다. 공급자 보호를 확인합니다.
- 해제 전에 참조를 삭제하거나 통제 중인 대상으로 바꿉니다. 이전 TTL과 캐시를 고려하고 권한 DNS 및 여러 리졸버를 확인합니다. 필요한 소유 검증은 유지하고 TXT를 모두 지우지 않습니다.
- 링크, 리디렉션, OAuth 콜백, 웹훅과 쿠키 도메인을 확인합니다. 이미 해제됐다면 DNS를 수정하고 사고 절차로 노출을 조사합니다. 삭제마다 DNS와 리소스를 대조합니다.
재현 가능한 수락 사례
가상 예시입니다. 고객이나 실제 관측 결과를 나타내지 않습니다.
사례 입력 보기
{
"name": "portal.example",
"cname_present": true,
"resource_deleted": true,
"provider_claimability": "not_verified",
"takeover_observed": false,
"expected": "remove_or_replace_mapping_and_review_exposure"
}예상 판단
가상 예: portal.example이 삭제된 리소스를 가리킵니다. CNAME을 제거하거나 통제하는 대상으로 바꾸세요. 리소스 부재만으로 제삼자 탈취를 입증할 수 없습니다.
오류 페이지가 탈취 가능성을 입증하나요?
아닙니다. 리소스 상태와 공급자의 이름 예약 또는 소유 검증을 확인하세요. 위험 증명을 위해 리소스를 확보하지 마세요.
1차 자료: Microsoft — Prevent dangling DNS entries. 관련 방법: 실무 가이드 읽기.
ETag, HTTP 캐시 및 동시 변경
이 언어판의 상세 참고 설명은 영어로 제공됩니다.
Revalidation does not replace cache isolation
A matching If-None-Match can justify 304 for the selected representation after access checks. It does not by itself select the correct user variant.
- Separate variant selection, authorisation and validator comparison.
- Test weak and strong tags with If-None-Match: the comparison is weak.
- Read no-cache as validation before reuse, rather than no-store.
Explore ETag comparisons and the simulator →
References reviewed · RFC 9110 · §13 · RFC 9111 · RFC 6585 · §3
GraphQL: 오류, 목록 및 부분 데이터
이 언어판의 상세 참고 설명은 영어로 제공됩니다.
GraphQL result: follow the error path
Aliases belong to the result; list indices start at zero. These details determine where a client should flag missing data.
- Compare absent data, partial data and data: null.
- Keep the original path even when a parent becomes null.
- Test permissions, quotas and interface states separately.
Explore GraphQL responses and nullability →
GraphQL Specification · September 2025 · Published edition · September 2025
