하위 리소스 무결성

W3C 작업 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-sri-2-20260320/
최신 발행 버전:
https://www.w3.org/TR/sri-2/
편집자 초안:
https://w3c.github.io/webappsec-subresource-integrity/
이전 버전:
이력:
https://www.w3.org/standards/history/sri-2/
피드백:
public-webappsec@w3.org 제목 줄 “[sri] … 메시지 주제 …”로 (아카이브)
GitHub
편집자:
Frederik Braun (Mozilla)
이전 편집자:
Devdatta Akhawe (Dropbox Inc.)
François Marier (Mozilla)
Joel Weinberger (Google Inc.)
테스트 스위트:
https://wpt.fyi/results/subresource-integrity/

초록

이 명세는 사용자 에이전트가 가져온 리소스가 예기치 않은 조작 없이 전달되었는지를 검증할 수 있는 메커니즘을 정의한다.

이 문서의 상태

이 절은 문서가 발행된 시점에서의 문서 상태를 설명한다. 현재 W3C 발행물과 이 기술 보고서의 최신 개정판 목록은 W3C 기술 보고서 색인에서 찾을 수 있다.

이 문서는 Web Application Security Working Group에서 Recommendation 트랙을 사용하여 작업 초안으로 발행했다. 이 문서는 W3C Recommendation이 되는 것을 목표로 한다.

이 명세에 대한 논의에는 (아카이브된) 공개 메일링 리스트 public-webappsec@w3.org (안내 참조)를 사용하는 것이 권장된다. 전자 메일을 보낼 때에는 제목에 “sri”라는 텍스트를 넣어야 하며, 가능하면 다음과 같이 하는 것이 좋다: “[sri] …의견 요약…

작업 초안으로 발행되었다고 해서 W3C와 그 회원들이 승인했다는 뜻은 아니다. 이는 초안 문서이며 언제든지 다른 문서로 갱신되거나 대체되거나 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.

이 문서는 Web Application Security Working Group에서 작성했다.

이 문서는 W3C Patent Policy에 따라 운영되는 그룹에서 작성했다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 공개 특허 공개 목록을 유지하고 있으며; 해당 페이지에는 특허 공개 방법에 대한 안내도 포함되어 있다. 자신이 Essential Claim(s)을 포함한다고 믿는 특허에 대해 실제 지식을 가진 개인은 Essential Claim(s) 그 정보를 W3C Patent Policy의 6절에 따라 공개해야 한다.

이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받는다.

1. 소개

웹의 사이트와 애플리케이션은 단일 출처의 리소스만으로 구성되는 일이 드물다. 예를 들어, 작성자는 매우 다양한 서비스와 콘텐츠 전송 네트워크에서 스크립트와 스타일을 가져오며, 전달된 표현이 실제로 자신이 로드할 것으로 기대한 것이라고 신뢰해야 한다. 공격자가 사용자를 속여 적대적 서버에서 콘텐츠를 다운로드하게 할 수 있다면 (DNS [RFC1035] 포이즈닝 또는 그 밖의 유사한 수단을 통해), 작성자는 대응할 방법이 없다. 마찬가지로, 콘텐츠 전송 네트워크(CDN) 서버의 파일을 교체할 수 있는 공격자는 임의의 콘텐츠를 삽입할 수 있다.

보안 채널을 통해 리소스를 전달하면 이러한 위험의 일부를 완화할 수 있다. TLS [TLS], HSTS [RFC6797], 그리고 고정된 공개 키 [RFC7469]를 사용하면, 사용자 에이전트는 자신이 통신한다고 믿는 서버와 실제로 통신하고 있다고 상당히 확신할 수 있다. 그러나 이러한 메커니즘은 서버만 인증할 뿐, 콘텐츠는 인증하지 않는다. 서버에 접근할 수 있는 공격자(또는 관리자)는 아무런 제약 없이 콘텐츠를 조작할 수 있다. 이상적으로는 작성자가 서버의 키만 고정할 수 있는 것이 아니라 콘텐츠도 고정하여, 리소스의 정확한 표현, 그리고 오직 그 표현만이 로드되고 실행되도록 보장할 수 있어야 한다.

이 문서는 그러한 검증 방식을 지정하며, 작성자가 로드하기를 기대하는 리소스 표현의 암호학적 해시를 포함하는 integrity 속성으로 두 HTML 요소를 확장한다. 예를 들어, 작성자는 어떤 프레임워크를 자기 출처에 호스팅하는 대신 공유 서버에서 로드하고자 할 수 있다. https://example.com/example-framework.js기대되는 SHA-384 해시가 Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7라고 지정하면, 사용자 에이전트는 그 URL에서 로드한 데이터가 그 안에 포함된 JavaScript를 실행하기 전에 기대한 해시와 일치하는지 검증할 수 있다. 이 무결성 검증은 공격자가 악성 콘텐츠로 대체할 수 있는 위험을 크게 줄인다.

이 예시는 다음과 같이 해시를 script 요소에 추가하여 사용자 에이전트에 전달할 수 있다:

<script src="https://example.com/example-framework.js"
        integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7"
        crossorigin="anonymous"></script>

물론 스크립트만이 무결성 검증의 이점을 얻을 수 있는 응답 유형은 아니다. 여기서 지정하는 방식은 link에도 적용되며, 이 명세의 향후 버전은 이 적용 범위를 확대할 가능성이 높다.

테스트

1.1. 목표

  1. 제3자 서비스가 손상되었다고 해서 그 스크립트를 포함하는 모든 사이트가 자동으로 손상되어서는 안 된다. 콘텐츠 작성자는 로드하는 콘텐츠에 대한 기대값을 지정할 수 있는 메커니즘을 갖게 되며, 예를 들어 특정 URL을 가지고 있는 아무 스크립트가 아니라 특정한 스크립트를 로드할 수 있게 된다.

  2. 검증 메커니즘은 유효하지 않은 응답이 수신되었음을 작성자에게 알려 주는 오류 보고 기능을 가져야 한다.

1.2. 사용 사례/예시

1.2.1. 리소스 무결성

2. 핵심 개념과 용어

이 절은 문서 전체에서 사용되는 여러 용어를 정의한다.

digest라는 용어는 임의의 데이터 블록에 암호학적 해시 함수를 실행한 결과를 base64로 인코딩한 것을 가리킨다.

originsame origin 용어는 HTML에서 정의된다. [HTML]

base64 encodingRFC 4648의 4절에서 정의된다. [RFC4648]

SHA-256, SHA-384, 그리고 SHA-512는 NIST가 정의한 SHA-2 암호학적 해시 함수 집합의 일부이다. [SHA2]

valid SRI hash algorithm token set순서 있는 집합 « "sha256", "sha384", "sha512" »이다(각각 SHA-256, SHA-384, 그리고 SHA-512에 대응한다). 이 집합의 순서는 의미가 있으며, 더 강한 알고리즘이 집합의 뒤쪽에 나타난다. 추가 정보는 § 3.2.2 우선순위§ 3.3.3 set에서 가장 강한 메타데이터 가져오기를 참조하라.

문자열은 그 ASCII 소문자valid SRI hash algorithm token set포함되어 있다면 valid SRI hash algorithm token이다.

2.1. 문법 개념

이 문서에서 사용하는 Augmented Backus-Naur Form (ABNF) 표기법은 RFC5234에 지정되어 있다. [ABNF]

부록 B.1[ABNF]VCHAR(출력 문자) 및 WSP (공백) 규칙을 정의한다.

Content Security Policy는 base64-valuehash-algorithm 규칙을 정의한다. [CSP]

3. 프레임워크

여기서 지정하는 무결성 검증 메커니즘은 본질적으로 리소스에 대해 충분히 강한 암호학적 digest를 생성하고, 그 digest를 사용자 에이전트에 전달하여 응답 검증에 사용할 수 있게 하는 과정이다.

3.1. 무결성 메타데이터

응답의 무결성을 검증하려면, 사용자 에이전트는 request의 일부로 무결성 메타데이터를 필요로 한다. 이 메타데이터는 다음 정보 조각으로 구성된다:

응답의 무결성을 검증하려면 해시 함수와 digest가 반드시 제공되어야 한다.

참고: 현재는 정의된 옵션이 없다. 그러나 명세의 향후 버전에서는 MIME 유형 [MIME-TYPES]과 같은 옵션을 정의할 수 있다.

이 메타데이터는 Content Security Policy Level 2 명세의 4.2절에 있는 hash-source(작은따옴표 제외)와 동일한 형식으로 인코딩되어야 한다.

예를 들어, 문자열 alert('Hello, world.');만 포함하는 스크립트 리소스가 주어졌을 때, 작성자는 해시 함수로 SHA-384를 선택할 수 있다. H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO는 그 결과로 나오는 base64 인코딩된 digest이다. 이는 다음과 같이 인코딩할 수 있다:

sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO
Digest는 여러 유틸리티를 사용하여 생성할 수 있다. 예를 들어 OpenSSL은 매우 흔히 사용할 수 있다. 이 절의 예시는 다음 명령줄의 결과이다:
echo -n "alert('Hello, world.');" | openssl dgst -sha384 -binary | openssl base64 -A

3.2. 암호학적 해시 함수

적합한 사용자 에이전트는 요청의 무결성 메타데이터 일부로 사용할 SHA-256, SHA-384, 그리고 SHA-512 암호학적 해시 함수를 반드시 지원해야 하며, 이 문서의 향후 반복에서 정의되는 추가 해시 함수를 지원할 수 있다.

참고: 이 문서에서 지원되는 알고리즘은 (현재로서는!) 두 번째 원상 공격과 충돌 공격에 저항한다고 여겨진다. 지원 알고리즘 집합에 대한 향후 추가/제거는 유사한 기준을 적용하는 것이 바람직하다. § 5.2 해시 충돌 공격을 참조하라.

3.2.1. 민첩성

미래의 암호학적 발견에 대응할 수 있는 민첩성을 제공하기 위해, 여러 무결성 메타데이터 집합을 하나의 리소스에 연결할 수 있다. 예를 들어 이전 절에서 설명한 리소스는 다음 두 해시 표현 중 어느 하나로 설명될 수 있다:

sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO
sha512-Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/A0EzCinRE7Af1ofPrw==

작성자는 예를 들어 둘 다 지정하도록 선택할 수 있다:

<script src="hello_world.js"
   integrity="sha384-H8BRh8j48O9oYatfu5AZzq6A9RINhZO5H16dQZngK7T62em8MUt1FLm52t+eX6xO
              sha512-Q2bFTOhEALkN8hOms2FKTDLy7eugP2zFZ1T8LCvX42Fp3WoNr3bjZSAHeOsHrbV1Fu9/A0EzCinRE7Af1ofPrw=="
   crossorigin="anonymous"></script>

이 경우 사용자 에이전트는 목록에서 가장 강한 해시 함수를 선택하고, 아래 § 3.3.2 메타데이터 구문 분석§ 3.3.3 set에서 가장 강한 메타데이터 가져오기 알고리즘에 설명된 대로 그 메타데이터를 사용하여 응답을 검증한다.

해시 함수가 안전하지 않다고 판단되면, 사용자 에이전트는 안전하지 않은 해시 함수를 사용한 무결성 검증 지원을 폐기 예정으로 표시하고 결국 제거해야 한다. 사용자 에이전트는 폐기 예정 함수에 기반한 digest를 사용하여 응답의 유효성을 검사할 수 있다.

작성자가 오래된 사용자 에이전트에 발목 잡히지 않고 더 강한 해시 함수로 전환할 수 있도록, 지원되지 않는 해시 함수를 사용한 검증은 무결성 값이 제공되지 않은 것처럼 동작한다 (아래 § 3.3.4 bytes가 metadataList와 일치하는가? 알고리즘 참조). 작성자는 강한 해시 함수를 사용하고, 더 강한 해시 함수를 사용할 수 있게 되는 즉시 그 함수로 마이그레이션을 시작하는 것이 권장된다.

3.2.2. 우선순위

해시 알고리즘의 우선순위는 valid SRI hash algorithm token set에서 각 토큰의 순서로 지정된다. 그 집합에서 더 앞에 나타나는 알고리즘은 더 뒤에 나타나는 알고리즘보다 약하다.

현재 지정된 바에 따르면, SHA-256SHA-384보다 약하고, 이는 다시 SHA-512보다 약하다. 현재 이 명세는 다른 해시 알고리즘을 지원하지 않는다.

3.3. 응답 검증 알고리즘

3.3.1. algorithmbytes에 적용

  1. resultalgorithmbytes에 적용한 결과로 둔다.

  2. resultbase64 encoding한 결과를 반환한다.

3.3.2. 메타데이터 구문 분석

문자열 metadata가 주어져 메타데이터를 구문 분석하라는 요청을 받으면 다음 단계를 실행한다:

참고: 이 알고리즘은 사용자 에이전트가 이해하는 해시 함수를 가진 해시 표현들의 집합을 반환한다.

  1. result를 빈 집합으로 둔다.

  2. metadata를 공백 기준으로 분할하여 반환된 각 item에 대해:

    1. expression-and-optionsitem을 U+003F (?) 기준으로 분할한 결과로 둔다.

    2. algorithm-expressionexpression-and-options[0]으로 둔다.

    3. base64-value를 빈 문자열로 둔다.

    4. algorithm-and-valuealgorithm-expression을 U+002D (-) 기준으로 분할한 결과로 둔다.

    5. algorithmalgorithm-and-value[0]으로 둔다.

    6. algorithmvalid SRI hash algorithm token이 아니면 continue한다.

    7. algorithm-and-value[1]이 존재하면, base64-valuealgorithm-and-value[1]로 설정한다.

    8. metadata를 순서 있는 맵 «["alg" → algorithm, "val" → base64-value]»로 둔다.

      참고: 정의된 options가 없기 때문에(§ 3.1 무결성 메타데이터 참조), metadata에는 이에 대응하는 항목이 설정되지 않는다. 향후 버전에서 options가 정의되면, expression-and-options[1]을 options로 활용할 수 있다.

    9. metadataresult추가한다.

  3. result를 반환한다.

3.3.3. set에서 가장 강한 메타데이터 가져오기

  1. result를 빈 집합으로, strongest를 null로 둔다.

  2. set의 각 item에 대해:

    1. Assert: item["alg"]는 valid SRI hash algorithm token이다.

    2. result가 빈 집합이면:

      1. itemresult추가한다.

      2. strongestitem으로 설정한다.

      3. Continue한다.

    3. currentAlgorithmstrongest["alg"]로 두고, currentAlgorithmIndexvalid SRI hash algorithm token set에서 currentAlgorithm의 인덱스로 둔다.

    4. newAlgorithmitem["alg"]로 두고, newAlgorithmIndexvalid SRI hash algorithm token set에서 newAlgorithm의 인덱스로 둔다.

    5. newAlgorithmIndexcurrentAlgorithmIndex보다 작으면, continue한다.

    6. 그렇지 않고 newAlgorithmIndexcurrentAlgorithmIndex보다 크면:

      1. strongestitem으로 설정한다.

      2. result를 « item »로 설정한다.

    7. 그렇지 않으면 newAlgorithmIndexcurrentAlgorithmIndex는 같은 값이다. itemresult추가한다.

  3. result를 반환한다.

3.3.4. bytesmetadataList와 일치하는가?

  1. parsedMetadatametadataList를 구문 분석한 결과로 둔다.

  2. parsedMetadata가 빈 집합이면 비어 있음, true를 반환한다.

  3. metadata parsedMetadata에서 가장 강한 메타데이터를 가져온 결과로 둔다.

  4. metadata의 각 item에 대해:

    1. algorithmitem["alg"]로 둔다.

    2. expectedValueitem["val"]로 둔다.

    3. actualValuealgorithmbytes에 적용한 결과로 둔다.

    4. actualValueexpectedValue와 대소문자를 구분하여 일치하면, true를 반환한다.

  5. false를 반환한다.

이 알고리즘은 사용자 에이전트가 여러 개의 유효한 강한 해시 함수를 허용할 수 있게 한다. 예를 들어 개발자는 다음과 같은 script 요소를 작성할 수 있다:

<script src="https://example.com/example-framework.js"
        integrity="sha384-Li9vy3DqF8tnTXuiaAJuML3ky+er10rcgNR/VqsVpcw+ThHmYcwiB1pbOxEbzJr7
                   sha384-+/M6kredJcxdsqkczBUjMLvqyHb1K/JThDXWsBVxMEeZHEaMKEOEct339VItX1zB"
        crossorigin="anonymous"></script>

이는 사용자 에이전트가 서로 다른 두 콘텐츠 페이로드를 허용할 수 있게 하며, 그중 하나는 첫 번째 SHA-384 해시 값과 일치하고 다른 하나는 두 번째 SHA-384 해시 값과 일치한다.

참고: 사용자 에이전트는 사용자 기본 설정, bookmarklet, 사용자 에이전트에 대한 제3자 추가 기능 및 기타 유사한 메커니즘을 통해 사용자가 이 알고리즘의 결과를 수정할 수 있도록 허용할 수 있다. 예를 들어 HTTPS Everywhere와 같은 확장이 생성한 리디렉션은, 리소스의 HTTPS 버전이 HTTP 버전과 다르더라도 올바르게 로드되고 실행될 수 있다.

참고: Subresource Integrity는 CORS를 필요로 하며, CORS 없이 사용하려고 시도하는 것은 논리적 오류이다. 사용자 에이전트는 이 실패를 설명하기 위해 개발자 콘솔에 경고 메시지를 보고하는 것이 권장된다. [Fetch]

3.4. HTML 문서 하위 리소스의 검증

여러 HTML 요소는 문서에 삽입되거나 그 컨텍스트에서 실행될 리소스에 대한 요청을 발생시킨다. 이러한 요소 중 일부에 대한 무결성 메타데이터를 지원하기 위해, linkscript 요소의 콘텐츠 속성 목록에 새로운 integrity 속성이 추가된다. [HTML]

참고: 이 명세의 향후 개정판은 가능한 모든 하위 리소스, 즉 a, audio, embed, iframe, img, link, object, script, source, track, 및 video 요소에 대한 무결성 지원을 포함할 가능성이 높다.

3.5. integrity 속성

integrity 속성은 요소의 무결성 메타데이터를 나타낸다. 이 속성의 값은 빈 문자열이거나, 다음 ABNF 문법으로 설명되는 하나 이상의 유효한 메타데이터여야 한다:

integrity-metadata = *WSP hash-with-options *(1*WSP hash-with-options ) *WSP / *WSP
hash-with-options  = hash-expression *("?" option-expression)
option-expression  = *VCHAR
hash-expression    = hash-algorithm "-" base64-value

option-expression은 각 hash-expression별로 연결되며, 바로 앞에 있는 hash-expression에만 적용된다.

사용자 에이전트가 향후 옵션과 완전한 전방 호환성을 유지하려면, 사용자 에이전트는 인식하지 못한 모든 option-expression을 무시해야 한다.

참고: option-expression은 구문에서 예약되어 있지만, 정의된 옵션은 없다는 점에 유의하라. 명세의 향후 버전에서 옵션에 대해 더 구체적인 구문을 정의할 가능성이 높으므로, 여기서는 가능한 한 넓게 정의한다.

무결성 메타데이터는 요소의 integrity 속성에 적용되는 것과 동일한 integrity-metadata 문법을 사용하여 지정해야 하는 integrity 링크 매개변수로, `link` HTTP 응답 헤더에도 지정할 수 있다. 예:

Link: </style.css>; rel=preload; as=style;  crossorigin="anonymous"; integrity="sha256-[digest goes here]"

3.7. 무결성 위반 처리

사용자 에이전트는 무결성 검사에 실패한 응답을 렌더링하거나 실행하는 것을 거부하고, 대신 Fetch에 정의된 network error를 반환한다 [Fetch].

참고: 무결성 검사 실패 시 error 이벤트가 발생한다. 표준 fallback 리소스(예: CDN에서 제공되지 않는 리소스, 아마도 보조적이고 신뢰할 수 있지만 더 느린 출처의 리소스)를 제공하려는 개발자는 이 error 이벤트를 포착하고 실패한 리소스를 다른 리소스로 교체하는 적절한 핸들러를 제공할 수 있다.

3.8. Integrity-Policy

Integrity-PolicyIntegrity-Policy-Report-Only HTTP 헤더는 문서가 특정 destinations의 모든 하위 리소스를 로드할 때 무결성 메타데이터 요구사항에 관한 정책을 시행할 수 있게 한다.

헤더의 값은 Dictionary [RFC9651]이며, 각 member-value는 inner list 형태의 tokens이다.

source는 문자열이다. 가능한 유일한 값은 "inline"이다.

destinationdestination type이다. 가능한 값은 "script"와 "style"이다.

integrity policy는 다음을 포함하는 struct이다:

header list headersheader name headerName가 주어진 상태에서 무결성 정책을 처리할 때에는 다음을 수행한다:

  1. integrityPolicy를 새 integrity policy로 둔다.

  2. dictionaryheaders에서 headerName과 "dictionary"가 주어졌을 때 structured field value를 가져온 결과로 둔다.

  3. dictionary["sources"]가 존재하지 않거나 그 값이 "inline"을 포함하면, "inline"을 integrityPolicysources추가한다.

  4. dictionary["blocked-destinations"]가 존재하면:

    1. 그 값이 "script"를 포함하면, "script"를 integrityPolicyblocked destinations추가한다.

    2. 그 값이 "style"을 포함하면, "style"을 integrityPolicyblocked destinations추가한다.

  5. dictionary["endpoints"]가 존재하면:

    1. integrityPolicyendpointsdictionary['endpoints']로 설정한다.

  6. integrityPolicy를 반환한다.

다음 헤더는 무결성 메타데이터 없이 로드되는 모든 외부 스크립트 (또는 모든 no-CORS 외부 스크립트)에 대한 요청을 차단한다.
Integrity-Policy: blocked-destinations=(script), endpoints=(integrity-endpoint)
차단은 "integrity-endpoint" 보고 엔드포인트에도 보고를 트리거한다 (관련 Reporting-Endpoints 헤더로 정의됨).

개발자는 "integrity-violation"에 대해 ReportingObserver를 등록하여 JavaScript 기반 보고를 받을 수도 있다.

3.8.1. Integrity-Policy 헤더 구문 분석

Response responsepolicy container container가 주어졌을 때 Integrity-Policy 헤더를 구문 분석하려면 다음을 수행한다:
  1. headersresponseheader list로 둔다.

  2. headersintegrity-policy포함하면, 해당 header value무결성 정책 처리를 실행한 결과를 containerintegrity policy로 설정한다.

  3. headersintegrity-policy-report-only포함하면, 해당 header value무결성 정책 처리를 실행한 결과를 containerreport only integrity policy로 설정한다.

3.8.2. 요청이 Integrity Policy에 의해 차단되어야 하는가

request request가 주어졌을 때, 요청이 무결성 정책에 의해 차단되어야 하는지를 결정하려면 다음을 수행한다:
  1. policyContainerrequestpolicy container로 둔다.

  2. parsedMetadatarequestintegrity metadataparse metadata를 호출한 결과로 둔다.

  3. parsedMetadata가 빈 집합이 아니고 requestmode가 "cors" 또는 "same-origin"이면, "Allowed"를 반환한다.

  4. requesturllocal이면, "Allowed"를 반환한다.

  5. policypolicyContainerintegrity policy로 둔다.

  6. reportPolicypolicyContainerreport only integrity policy로 둔다.

  7. policyreportPolicy가 모두 빈 integrity policy이면, "Allowed"를 반환한다.

  8. globalrequestclientglobal object로 둔다.

  9. globalWindow도 아니고 WorkerGlobalScope도 아니면, "Allowed"를 반환한다.

  10. block을 불리언으로 두고, 초깃값을 false로 한다.

  11. reportBlock을 불리언으로 두고, 초깃값을 false로 한다.

  12. policysources가 "inline"을 포함하고 policyblocked destinationsrequestdestination포함하면, block을 true로 설정한다.

  13. reportPolicysources가 "inline"을 포함하고 reportPolicyblocked destinationsrequestdestination포함하면, reportBlock을 true로 설정한다.

  14. block이 true이거나 reportBlock이 true이면, request, block, reportBlock, policyreportPolicy위반을 보고한다.

  15. block이 true이면 "Blocked"를 반환하고, 그렇지 않으면 "Allowed"를 반환한다.

3.8.3. 위반 보고

dictionary IntegrityViolationReportBody : ReportBody {
  USVString documentURL;
  USVString blockedURL;
  USVString destination;
  boolean   reportOnly;
};

Request request, 불리언 block, 불리언 reportBlock, integrity policy policy, 그리고 integrity policy reportPolicy가 주어졌을 때 위반을 보고하려면 다음을 수행한다:

  1. Assert: requestclient는 null이 아니다.

  2. settingsObjectrequestclient로 둔다.

  3. globalsettingsObjectglobal object로 둔다.

  4. Assert: globalWindow 또는 WorkerGlobalScope이다.

  5. url을 null로 둔다.

  6. globalWindow이면, urlglobalassociated DocumentURL로 설정한다.

  7. globalWorkerGlobalScope이면, urlglobalURL로 설정한다.

  8. Assert: urlURL이다.

  9. documentURLurlstrip URL for use in reports를 적용한 결과로 둔다.

  10. blockedURLrequestURLstrip URL for use in reports를 적용한 결과로 둔다.

  11. block이 true이면, policyendpoints에 있는 각 endpoint에 대해 반복한다:

    1. body를 다음과 같이 초기화된 새 IntegrityViolationReportBody로 둔다:

      documentURL

      documentURL

      blockedURL

      blockedURL

      destination

      requestdestination

      reportOnly

      false

    2. 다음 인수로 보고를 생성하고 큐에 넣는다:

      context

      settingsObject

      type

      "integrity-violation"

      destination

      endpoint

      data

      body

  12. reportBlock이 true이면, reportPolicyendpoints에 있는 각 endpoint에 대해 반복한다:

    1. reportBody를 다음과 같이 초기화된 새 IntegrityViolationReportBody로 둔다:

      documentURL

      documentURL

      blockedURL

      blockedURL

      destination

      requestdestination

      reportOnly

      true

    2. 다음 인수로 보고를 생성하고 큐에 넣는다:

      context

      settingsObject

      type

      "integrity-violation"

      destination

      endpoint

      data

      reportBody

4. 프록시

응답을 수정하는 최적화 프록시와 기타 중간 서버는 해당 응답과 연결된 digest가 새 콘텐츠와 동기화된 상태로 유지되도록 보장해야 한다. 한 가지 방법은 리소스와 연결된 무결성 메타데이터가 갱신되도록 보장하는 것이다. 또 다른 방법은 페이지 작성자가 무결성 검증을 요청한 리소스에 대해 정식 버전만 전달하는 것이다.

중간 서버에 정보를 제공하기 위해, 리소스를 제공하는 서버는 그 리소스와 함께 값이 no-transformCache-Control 헤더를 보내는 것이 좋다.

5. 보안 및 개인정보 보호 고려사항

이 절은 규범적이지 않다.

5.1. 비보안 컨텍스트는 비보안인 채로 남는다

HTTP 페이지와 같이 Secure Context가 아닌 컨텍스트에서 전달되는 무결성 메타데이터는 외부 리소스가 호스팅되는 서버의 손상에 대해서만 출처를 보호한다. 네트워크 공격자는 digest가 검증하려는 응답을 변경할 수 있는 것과 마찬가지로, 전송 중에 digest를 변경할 수 있다(또는 완전히 제거하거나, 문서에 대해 그 밖의 절대적으로 어떤 일이든 할 수 있다). 따라서 작성자는 무결성 메타데이터를 Secure Context에만 전달하는 것이 권장된다. 또한 Securing the Web을 참조하라.

5.2. 해시 충돌 공격

Digest는 이를 생성하는 데 사용되는 해시 함수만큼만 강하다. 사용자 에이전트는 알려진 약한 해시 함수의 지원을 거부하고, 충돌 저항성이 있는 것으로 알려진 알고리즘으로 지원 알고리즘을 제한하는 것이 권장된다. 권장되지 않는 해시 함수의 예로는 MD5와 SHA-1이 있다. 작성 시점에는 SHA-384가 좋은 기준선이다.

또한 사용자 에이전트는 지원하는 해시 함수를 정기적으로 재평가하고, 안전하지 않음이 드러난 함수의 지원을 폐기하는 것이 권장된다. 시간이 지남에 따라 해시 함수는 예상보다 훨씬 약하거나, 경우에 따라서는 깨진 것으로 밝혀질 수 있으므로, 사용자 에이전트가 이러한 발전을 계속 인지하는 것이 중요하다.

5.3. 교차 출처 데이터 누출

이 명세는 무결성으로 보호되는 교차 출처 요청이 CORS protocol을 사용하여 리소스의 콘텐츠가 요청자에게 명시적으로 공유되도록 요구한다. 이 요구사항이 생략되면, 공격자는 same-origin policy를 위반하고 교차 출처 리소스가 특정 콘텐츠를 가지고 있는지 확인할 수 있다.

공격자는 알려진 digest로 리소스를 로드하려 시도하고, 로드 실패를 관찰할 수 있다. 로드가 실패하면, 공격자는 응답이 해시와 일치하지 않았다고 추측하여 그 내용에 대한 일부 정보를 얻을 수 있다. 예를 들어, 사용자가 특정 서비스에 로그인했는지 여부를 드러낼 수 있다.

또한 공격자는 그 외에는 정적인 리소스에서 특정 값을 brute-force할 수 있다. 다음과 같은 JSON 응답을 고려하라:

{"status": "authenticated", "username": "admin"}

공격자는 다양한 흔한 사용자 이름을 사용한 응답의 해시를 미리 계산하고, 문서를 반복적으로 로드하려 시도하면서 그 해시들을 지정할 수 있다. 로드가 성공하면 공격자가 사용자 이름을 올바르게 추측했음이 확인된다.

6. 감사의 말

여기 있는 콘텐츠의 상당 부분은 Gervase Markham의 Link Fingerprints 개념과 WHATWG의 Link Hashes에서 크게 영감을 받았다.

이 명세의 초기 버전에 귀중한 기여를 해 준 Mike West에게 특별히 감사드린다. Brad Hill, Anne van Kesteren, Jonathan Kingston, Fatih Kilic, Mark Nottingham, Sergey Shekyan, Dan Veditz, Eduardo Vela, Tanvi Vyas, Yoav Weiss, 그리고 Michal Zalewski에게 귀중한 피드백을 제공해 준 데 대해 감사드린다.

적합성

문서 규약

적합성 요구사항은 서술적 단언과 RFC 2119 용어를 조합하여 표현한다. 이 문서의 규범적 부분에서 쓰이는 핵심 단어 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, 및 “OPTIONAL”은 RFC 2119에 설명된 대로 해석해야 한다. 그러나 가독성을 위해, 이 명세에서는 이러한 단어가 모두 대문자로 나타나지는 않는다.

명시적으로 비규범적이라고 표시된 절, 예시, 참고를 제외한 이 명세의 모든 텍스트는 규범적이다. [RFC2119]

이 명세의 예시는 “예를 들어”라는 말로 도입되거나 다음과 같이 class="example"을 사용하여 규범적 텍스트와 구분된다:

이는 정보 제공용 예시의 한 예이다.

정보 제공용 참고는 “참고”라는 말로 시작하며 다음과 같이 class="note"를 사용하여 규범적 텍스트와 구분된다:

참고, 이는 정보 제공용 참고이다.

테스트

이 명세의 내용과 관련된 테스트는 이와 같은 “테스트” 블록에 문서화될 수 있다. 이러한 블록은 비규범적이다.


적합한 알고리즘

알고리즘의 일부로 명령형으로 표현된 요구사항 (예: "선행 공백 문자를 모두 제거하라" 또는 "false를 반환하고 이 단계를 중단하라")은 알고리즘을 도입할 때 사용된 핵심 단어 ("must", "should", "may" 등)의 의미로 해석해야 한다.

알고리즘이나 특정 단계로 표현된 적합성 요구사항은 최종 결과가 동등한 한, 어떤 방식으로든 구현할 수 있다. 특히 이 명세에서 정의된 알고리즘은 이해하기 쉽도록 의도된 것이며 성능을 의도한 것은 아니다. 구현자는 최적화하는 것이 권장된다.

색인

이 명세에서 정의하는 용어

참조로 정의된 용어

참조

규범적 참조

[ABNF]
D. Crocker, Ed.; P. Overell. Augmented BNF for Syntax Specifications: ABNF. 2008년 1월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc5234
[CSP]
Mike West; Antonio Sartori. Content Security Policy Level 3. 2026년 3월 11일. WD. URL: https://www.w3.org/TR/CSP3/
[DOM]
Anne van Kesteren. DOM Standard. Living Standard. URL: https://dom.spec.whatwg.org/
[Fetch]
Anne van Kesteren. Fetch Standard. Living Standard. URL: https://fetch.spec.whatwg.org/
[HTML]
Anne van Kesteren; et al. HTML Standard. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[MIME-TYPES]
N. Freed; N. Borenstein. Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. 1996년 11월. Draft Standard. URL: https://www.rfc-editor.org/rfc/rfc2046
[REPORTING-1]
Douglas Creager; Ian Clelland; Mike West. Reporting API. 2025년 6월 11일. WD. URL: https://www.w3.org/TR/reporting-1/
[RFC2119]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[RFC4648]
S. Josefsson. The Base16, Base32, and Base64 Data Encodings. 2006년 10월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4648
[RFC7234]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. Hypertext Transfer Protocol (HTTP/1.1): Caching. 2014년 6월. Proposed Standard. URL: https://httpwg.org/specs/rfc7234.html
[RFC8288]
M. Nottingham. Web Linking. 2017년 10월. Proposed Standard. URL: https://httpwg.org/specs/rfc8288.html
[RFC9651]
M. Nottingham; P-H. Kamp. Structured Field Values for HTTP. 2024년 9월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc9651
[SHA2]
FIPS PUB 180-4, Secure Hash Standard. URL: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf
[URL]
Anne van Kesteren. URL Standard. Living Standard. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

정보 제공 참조

[RFC1035]
P. Mockapetris. Domain names - implementation and specification. 1987년 11월. Internet Standard. URL: https://www.rfc-editor.org/rfc/rfc1035
[RFC6797]
J. Hodges; C. Jackson; A. Barth. HTTP Strict Transport Security (HSTS). 2012년 11월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc6797
[RFC7469]
C. Evans; C. Palmer; R. Sleevi. Public Key Pinning Extension for HTTP. 2015년 4월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7469
[TLS]
E. Rescorla. The Transport Layer Security (TLS) Protocol Version 1.3. 2018년 8월. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8446

IDL 색인

dictionary IntegrityViolationReportBody : ReportBody {
  USVString documentURL;
  USVString blockedURL;
  USVString destination;
  boolean   reportOnly;
};