MIME 스니핑

현행 표준 — 최신 업데이트

참여:
GitHub whatwg/mimesniff (새 이슈, 오픈 이슈)
Matrix에서 채팅하기
커밋:
GitHub whatwg/mimesniff/커밋
이 커밋 기준 스냅샷
@mimesniff
테스트:
web-platform-tests mimesniff/ (진행 중 작업)
번역 (비규범적):
日本語
简体中文
한국어

요약

MIME 스니핑 표준은 리소스의 스니핑을 정의합니다.

1. 소개

HTTP Content-Type 헤더 필드는 HTTP 응답의 MIME 타입을 나타내기 위한 것입니다. 하지만 많은 HTTP 서버가 실제 응답 내용과 일치하지 않는 Content-Type 헤더 필드 값을 제공합니다. 역사적으로 웹 브라우저들은 Content-Type 헤더 필드 외에도 HTTP 응답의 내용을 추가로 검사하여 응답의 실질적인 MIME 타입을 결정함으로써 이러한 서버를 허용해 왔습니다.

MIME 타입을 "스니핑"하는 방법에 대한 명확한 명세가 없었기 때문에, 각 사용자 에이전트는 상호 운용성을 유지하기 위해 다른 사용자 에이전트의 알고리즘을 역설계할 수밖에 없었습니다. 결국 이러한 노력은 완전히 성공하지 못했고, 사용자 에이전트들 간의 동작이 달라지게 되었습니다. 경우에 따라 이러한 동작 차이로 인해 보안 문제가 발생하기도 했는데, 사용자 에이전트가 서버가 의도한 것과 다른 MIME 타입으로 HTTP 응답을 해석할 수 있기 때문입니다.

이러한 보안 문제는 "정직한" 서버가 잠재적으로 악의적인 사용자가 직접 파일을 업로드할 수 있도록 허용한 뒤, 해당 파일의 내용을 낮은 권한의 MIME 타입으로 제공할 때 가장 심각하게 나타납니다. 예를 들어, 서버가 클라이언트가 업로드된 파일을 이미지로 취급할 것이라 생각하여 안전하다고 여기지만, 사용자 에이전트는 해당 콘텐츠를 HTML로 인식하여 포함된 스크립트를 실행할 권한을 부여하는 경우, 공격자는 사용자의 인증 정보를 탈취하거나 기타 크로스사이트 스크립팅 공격을 할 수 있습니다. (물론 악의적인 서버는 Content-Type 헤더 필드에 임의의 MIME 타입을 지정할 수 있습니다.)

이 문서는 사용자 에이전트의 호환성 요구와 기존 웹 콘텐츠가 부과하는 보안 제약을 신중히 균형 있게 고려한 콘텐츠 스니핑 알고리즘을 설명합니다. 이 알고리즘은 Adam Barth, Juan Caballero, Dawn Song의 연구에서 비롯되었으며, 인기 있는 사용자 에이전트에 구현된 콘텐츠 스니핑 알고리즘, 기존 웹 콘텐츠의 방대한 데이터베이스, 다수의 사용자에게 배포된 구현에서 수집된 메트릭을 바탕으로 만들어졌습니다. [SECCONTSNIFF]

2. 적합성 요건

이 문서에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", "OPTIONAL"과 같은 키워드는 RFC 2119에 따라 해석되어야 합니다. 가독성을 위해 이러한 키워드는 일반적으로 모두 대문자로 표기되지 않습니다. [KEYWORDS]

알고리즘의 일부로 명령문 형태로 표현된 요구 사항(예: "선행 공백 문자를 제거한다" 또는 "false를 반환하고 이 단계를 중단한다")은 알고리즘을 소개할 때 사용된 키워드의 의미로 해석되어야 합니다.

알고리즘이나 구체적인 단계로 표현된 적합성 요건은 최종 결과가 동일하기만 하다면 어떤 방식으로든 구현할 수 있습니다. 특히, 이 명세에서 정의한 알고리즘은 이해하기 쉽게 설계되어 있으며 성능을 고려한 것은 아닙니다.

3. 용어

이 명세는 Infra 표준에 의존합니다. [INFRA]

HTTP 토큰 코드 포인트는 U+0021 (!), U+0023 (#), U+0024 ($), U+0025 (%), U+0026 (&), U+0027 ('), U+002A (*), U+002B (+), U+002D (-), U+002E (.), U+005E (^), U+005F (_), U+0060 (`), U+007C (|), U+007E (~) 또는 ASCII 영숫자입니다.

이는 token 토큰 생산의 값 범위와 일치합니다. [HTTP-SEMANTICS]

HTTP 쿼티드-스트링 토큰 코드 포인트는 U+0009 TAB, 코드 포인트 U+0020 SPACE부터 U+007E (~)까지의 범위, 또는 코드 포인트 U+0080부터 U+00FF (ÿ)까지의 범위에 포함됩니다.

이는 quoted-string 토큰 생산의 실질적인 값 범위와 일치합니다. 정의상 HTTP 토큰 코드 포인트의 상위 집합입니다. [HTTP-SEMANTICS]

바이너리 데이터 바이트바이트 0x00부터 0x08까지(NUL부터 BS), 바이트 0x0B(VT), 바이트 0x0E부터 0x1A까지(SO부터 SUB), 또는 바이트 0x1C부터 0x1F까지(FS부터 US)입니다.

공백 바이트 (0xWS)는 다음 바이트 중 하나입니다: 0x09(HT), 0x0A(LF), 0x0C(FF), 0x0D(CR), 0x20(SP).

태그-종결 바이트 (0xTT)는 다음 바이트 중 하나입니다: 0x20(SP), 0x3E(">").

수식은 [ENCODING]에 정의된 수학 연산자를 사용합니다. 추가로, 비트 NOT 연산은 ~로 표시됩니다.

4. MIME 타입

4.1. MIME 타입 표현

MIME 타입인터넷 미디어 타입을 나타내며, Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types에서 정의됩니다. MIME 타입 레코드라고도 부를 수 있습니다. [MIMETYPE]

표준에서는 혼동을 피하기 위해 MIME 타입이라는 용어를 일관되게 사용할 것을 권장합니다. 미디어 타입 용어는 Media Queries에서 다르게 사용됩니다. [MEDIAQUERIES]

MIME 타입type은 비어 있지 않은 ASCII 문자열입니다.

MIME 타입subtype은 비어 있지 않은 ASCII 문자열입니다.

MIME 타입parameters순서가 있는 맵이며, ASCII 문자열이고, 문자열로, HTTP 쿼티드-스트링 토큰 코드 포인트로 제한됩니다. 초기값은 비어 있습니다.

4.2. MIME 타입 기타

MIME 타입 mimeTypeessencemimeTypetype 뒤에 U+002F(/)를 붙이고, mimeTypesubtype을 붙인 값입니다.

MIME 타입사용자 에이전트가 지원함 상태일 때, 사용자 에이전트가 해당 리소스를 해석하고 사용자에게 표시할 수 있는 경우를 의미합니다.

이 부분은 더 명확하게 다루는 것이 이상적입니다. w3c/preload #113를 참고하세요.

지원되는 MIME 타입 최소화MIME 타입 mimeType에 대해 수행하려면 다음 단계를 따릅니다. 반환값은 ASCII 문자열입니다.

  1. mimeTypeJavaScript MIME 타입이면 "text/javascript"를 반환합니다.

  2. mimeTypeJSON MIME 타입이면 "application/json"을 반환합니다.

  3. mimeTypeessence가 "image/svg+xml"이면 "image/svg+xml"을 반환합니다.

    SVG는 다른 XML MIME 타입과 구분할 가치가 있습니다.

  4. mimeTypeXML MIME 타입이면 "application/xml"을 반환합니다.

  5. mimeType사용자 에이전트가 지원함이면 mimeTypeessence를 반환합니다.

  6. 빈 문자열을 반환합니다.

이 알고리즘의 목적은 GIF와 PNG처럼 처리 모델이 다른 MIME 타입을 구분할 수 있게 하면서, 그 외에는 가능한 한 적은 정보를 제공하는 것입니다.

4.3. MIME 타입 작성

유효한 MIME 타입 문자열media-type 토큰 생산과 일치하는 문자열입니다. 특히, 유효한 MIME 타입 문자열parameters를 포함할 수 있습니다. [HTTP-SEMANTICS]

유효한 MIME 타입 문자열은 적합성 검사기에서만 사용해야 합니다.

"text/html"은 유효한 MIME 타입 문자열입니다.

"text/html;"은 유효한 MIME 타입 문자열이 아니지만, MIME 타입 파싱을 수행하면 입력이 "text/html"일 때와 동일한 MIME 타입 레코드를 반환합니다.

파라미터 없는 유효한 MIME 타입 문자열유효한 MIME 타입 문자열 중 U+003B(;)가 포함되지 않은 문자열입니다.

4.4. MIME 타입 파싱

MIME 타입 파싱을 하려면, 문자열 input을 받아 다음 단계를 수행합니다:

  1. input에서 선행 및 후행 HTTP 공백을 제거합니다.

  2. positioninput포지션 변수로 설정하며, 처음에는 input의 시작을 가리킵니다.

  3. typeU+002F(/)이 아닌 코드 포인트 시퀀스 수집 결과로 설정합니다. inputposition 사용.

  4. type이 빈 문자열이거나 HTTP 토큰 코드 포인트만 포함하지 않으면, 실패를 반환합니다.

  5. positioninput의 끝을 지난 경우, 실패를 반환합니다.

  6. position을 1만큼 증가시킵니다. (U+002F(/)를 건너뜁니다.)

  7. subtypeU+003B(;)이 아닌 코드 포인트 시퀀스 수집 결과로 설정합니다. inputposition 사용.

  8. subtype에서 후행 HTTP 공백을 제거합니다.

  9. subtype이 빈 문자열이거나 HTTP 토큰 코드 포인트만 포함하지 않으면, 실패를 반환합니다.

  10. mimeType을 새 MIME 타입 레코드로 설정합니다. typetypeASCII 소문자 변환값, subtypesubtypeASCII 소문자 변환값으로 설정합니다.

  11. positioninput의 끝을 지나지 않은 동안:

    1. position을 1만큼 증가시킵니다. (U+003B(;)를 건너뜁니다.)

    2. HTTP 공백 코드 포인트 시퀀스 수집inputposition으로 수행합니다.

      이는 ASCII 공백 건너뛰기와 유사하지만 HTTP 공백을 사용합니다(ASCII 공백과 다름).

    3. parameterNameU+003B(;) 또는 U+003D(=)이 아닌 코드 포인트 시퀀스 수집 결과로 설정합니다. inputposition 사용.

    4. parameterNameASCII 소문자로 변환합니다.

    5. positioninput의 끝을 지나지 않았다면:

      1. position 위치의 코드 포인트가 U+003B(;)이면, continue.

      2. position을 1만큼 증가시킵니다. (U+003D(=)를 건너뜁니다.)

    6. positioninput의 끝을 지나면 break.

    7. parameterValue를 null로 설정합니다.

    8. position 위치의 코드 포인트가 U+0022(")이면:

      1. parameterValueHTTP 쿼티드 스트링 수집 결과로 설정합니다. input, position, true 사용.

      2. parameterValueU+003B(;)이 아닌 코드 포인트 시퀀스 수집 결과로 설정합니다. input, position 사용.

        예시: text/html;charset="shift_jis"iso-2022-jp를 입력하면 text/html;charset=shift_jis가 결과가 됩니다.

    9. 그 외의 경우:

      1. parameterValueU+003B(;)이 아닌 코드 포인트 시퀀스 수집 결과로 설정합니다. input, position 사용.

      2. parameterValue에서 후행 HTTP 공백을 제거합니다.

      3. parameterValue가 빈 문자열이면, continue.

    10. 다음 조건이 모두 참이면

      그렇다면 set mimeTypeparameters[parameterName]을 parameterValue로 설정합니다.

  12. mimeType을 반환합니다.


바이트에서 MIME 타입 파싱을 하려면 바이트 시퀀스 input을 받아 다음 단계를 수행합니다:

  1. stringinputisomorphic decode 결과로 설정합니다.

  2. MIME 타입 파싱string으로 수행한 결과를 반환합니다.

4.5. MIME 타입 직렬화

MIME 타입 직렬화를 하려면, MIME 타입 mimeType을 받아 다음 단계를 수행합니다:

  1. serializationmimeTypetype, U+002F(/), mimeTypesubtype을 이어붙인 값으로 설정합니다.

  2. namevalue에 대해 mimeTypeparameters에서:

    1. serialization에 U+003B(;)를 추가합니다.

    2. serializationname을 추가합니다.

    3. serialization에 U+003D(=)를 추가합니다.

    4. valueHTTP 토큰 코드 포인트만 포함하지 않거나 빈 문자열이면:

      1. value 내 U+0022(") 또는 U+005C(\)가 나올 때마다 앞에 U+005C(\)를 붙입니다.

      2. value 앞에 U+0022(")를 추가합니다.

      3. value 뒤에 U+0022(")를 추가합니다.

    5. serializationvalue를 추가합니다.

  3. serialization을 반환합니다.


MIME 타입을 바이트로 직렬화하려면, MIME 타입 mimeType을 받아 다음 단계를 수행합니다:

  1. stringSerializationMIME 타입 직렬화mimeType에 대해 수행한 결과로 설정합니다.

  2. stringSerializationisomorphic encode한 결과를 반환합니다.

4.6. MIME 타입 그룹

이미지 MIME 타입MIME 타입type이 "image"인 경우입니다.

오디오 또는 비디오 MIME 타입MIME 타입type이 "audio" 또는 "video"이거나, essence가 "application/ogg"인 경우입니다.

폰트 MIME 타입MIME 타입type이 "font"이거나, essence가 다음 중 하나일 때입니다: [RFC8081]

ZIP 기반 MIME 타입MIME 타입subtype이 "+zip"으로 끝나거나 essence가 다음 중 하나인 경우입니다:

아카이브 MIME 타입MIME 타입essence가 다음 중 하나일 때입니다:

XML MIME 타입MIME 타입subtype 이 "+xml"로 끝나거나 essence가 "text/xml" 또는 "application/xml"인 경우입니다. [RFC7303]

HTML MIME 타입MIME 타입essence가 "text/html"인 경우입니다.

스크립트 가능 MIME 타입XML MIME 타입, HTML MIME 타입, 또는 MIME 타입essence가 "application/pdf"인 경우입니다.

JavaScript MIME 타입MIME 타입essence가 다음 중 하나인 경우입니다:

문자열JavaScript MIME 타입 essence 매치이려면, ASCII 대소문자 구분 없이 JavaScript MIME 타입 essence 문자열 중 하나와 일치해야 합니다.

이 훅은 type 속성 및 script 요소에 사용됩니다. [HTML]

JSON MIME 타입MIME 타입subtype 이 "+json"으로 끝나거나 essence가 "application/json" 또는 "text/json"인 경우입니다.

5. 리소스 처리

리소스란 ….

사용자 에이전트는 처리하는 각 리소스에 대해 다음의 관련 메타데이터를 추적해야 합니다:

5.1. 리소스 메타데이터 해석

제공된 MIME 타입리소스와 연관된 외부 소스에 의해 사용자 에이전트에 제공됩니다. 이 정보를 얻는 방법은 리소스를 어떻게 가져오는지에 따라 달라집니다.

리소스제공된 MIME 타입을 결정하기 위해 사용자 에이전트는 다음 제공된 MIME 타입 검출 알고리즘을 사용해야 합니다:

  1. supplied-type을 null로 설정합니다.
  2. 리소스가 HTTP를 통해 가져온 경우, 다음 단계를 실행합니다:
    1. 리소스에 하나 이상의 Content-Type 헤더가 연관되어 있다면, 다음 단계를 실행합니다:
      1. supplied-type리소스에 연관된 마지막 Content-Type 헤더의 값으로 설정합니다.

        파일 확장자는 HTTP로 가져온 리소스제공된 MIME 타입을 결정하는 데 사용되지 않습니다. 이는 신뢰성이 낮고 쉽게 위조될 수 있기 때문입니다.

      2. supplied-type이 아래 표에 있는 값 중 정확히 일치하면 apache 버그 검사 플래그를 설정합니다:
        16진수 바이트 ASCII 바이트
        74 65 78 74 2F 70 6C 61 69 6E text/plain
        74 65 78 74 2F 70 6C 61 69 6E
        3B 20 63 68 61 72 73 65 74 3D
        49 53 4F 2D 38 38 35 39 2D 31
        text/plain; charset=ISO-8859-1
        74 65 78 74 2F 70 6C 61 69 6E
        3B 20 63 68 61 72 73 65 74 3D
        69 73 6F 2D 38 38 35 39 2D 31
        text/plain; charset=iso-8859-1
        74 65 78 74 2F 70 6C 61 69 6E
        3B 20 63 68 61 72 73 65 74 3D
        55 54 46 2D 38
        text/plain; charset=UTF-8

        제공된 MIME 타입 검출 알고리즘은 일부 오래된 Apache 설치에 버그가 있어, 인식하지 못하는 MIME 타입의 파일을 제공할 때 이러한 Content-Type 헤더 중 하나를 제공하는 경우를 검출합니다.

    [HTTP-SEMANTICS]

  3. 리소스가 파일 시스템에서 직접 가져온 경우, supplied-type을 파일 시스템이 제공한 MIME 타입으로 설정합니다.
  4. 리소스가 다른 프로토콜(예: FTP)로 가져온 경우, 해당 프로토콜에 의해 결정된 MIME 타입이 있으면 supplied-type으로 설정합니다.

    [FTP]

  5. supplied-typeMIME 타입이 아니면, 제공된 MIME 타입은 정의되지 않습니다.

    이 단계를 중단합니다.

  6. 제공된 MIME 타입supplied-type입니다.

5.2. 리소스 헤더 읽기

리소스 헤더바이트 시퀀스로, 리소스 헤더 읽기에 의해 리소스의 시작 부분에서 결정됩니다.

리소스 헤더 읽기를 수행하려면 다음 단계를 따릅니다:

  1. buffer바이트 시퀀스로 설정합니다.
  2. 바이트리소스에서 buffer로 읽어들이며, 다음 조건 중 하나에 도달하면 중단합니다:
    • 리소스의 끝에 도달한 경우
    • buffer바이트 수가 1445 이상인 경우
    • 사용자 에이전트가 판단한 합리적인 시간이 경과한 경우

    buffer 내 바이트 수가 1445 이상이면 MIME 타입 스니핑 알고리즘은 대부분의 경우 결정적입니다.

    하지만 느린 연결 등으로 인해 사용자 에이전트가 합리적인 시간 내에 1445 바이트를 읽지 못할 수도 있습니다.

  3. 리소스 헤더buffer입니다.

리소스 헤더는 각 리소스마다 한 번만 결정하면 됩니다.

6. MIME 타입 패턴 매칭

바이트 패턴바이트 시퀀스로, 패턴 매칭 알고리즘에서 템플릿으로 사용됩니다.

패턴 마스크바이트 시퀀스로, 비교되는 바이트의 중요도를 바이트 패턴패턴 매칭 알고리즘에서 결정합니다.

패턴 마스크에서 0xFF는 해당 바이트가 엄격하게 중요함을, 0xDF는 바이트가 ASCII 대소문자 구분 없이 중요함을, 0x00은 바이트가 중요하지 않음을 나타냅니다.

특정 바이트 시퀀스바이트 패턴과 일치하는지 확인하려면, 다음 패턴 매칭 알고리즘을 사용합니다. 바이트 시퀀스 input, 바이트 패턴 pattern, 패턴 마스크 mask, 그리고 무시할 바이트 집합 ignored을 받아 true 또는 false를 반환합니다.

  1. Assert: pattern길이mask길이와 같음.

  2. input길이pattern길이보다 작으면 false를 반환합니다.

  3. s를 0으로 설정합니다.

  4. s < input길이일 때:

    1. ignoredinput[s]을 포함하지 않으면, break.

    2. ss + 1로 설정합니다.

  5. p를 0으로 설정합니다.

  6. p < pattern길이일 때:

    1. maskedDatainput[s]과 mask[p]에 비트 AND 연산을 적용한 결과로 설정합니다.

    2. maskedDatapattern[p]과 같지 않으면 false를 반환합니다.

    3. ss + 1로 설정합니다.

    4. pp + 1로 설정합니다.

  7. true를 반환합니다.

6.1. 이미지 타입 패턴 매칭

어떤 이미지 MIME 타입 바이트 패턴바이트 시퀀스 input이 일치하는지(있다면)를 결정하려면, 다음 이미지 타입 패턴 매칭 알고리즘을 사용합니다:

  1. 다음 표의 각 row에 대해 다음 단계를 실행합니다:

    1. patternMatched패턴 매칭 알고리즘input, row의 첫 번째 열, 두 번째 열, 세 번째 열의 값으로 실행한 결과로 설정합니다.

    2. patternMatched가 true이면 row의 네 번째 열의 값을 반환합니다.

    바이트 패턴 패턴 마스크 선행 바이트 무시 이미지 MIME 타입 비고
    00 00 01 00 FF FF FF FF 없음. image/x-icon 윈도우 아이콘 시그니처.
    00 00 02 00 FF FF FF FF 없음. image/x-icon 윈도우 커서 시그니처.
    42 4D FF FF 없음. image/bmp 문자열 "BM", BMP 시그니처.
    47 49 46 38 37 61 FF FF FF FF FF FF 없음. image/gif 문자열 "GIF87a", GIF 시그니처.
    47 49 46 38 39 61 FF FF FF FF FF FF 없음. image/gif 문자열 "GIF89a", GIF 시그니처.
    52 49 46 46 00 00 00 00 57 45 42 50 56 50 FF FF FF FF 00 00 00 00 FF FF FF FF FF FF 없음. image/webp 문자열 "RIFF" 뒤에 4개의 바이트가 오고, 그 뒤에 문자열 "WEBPVP"가 옵니다.
    89 50 4E 47 0D 0A 1A 0A FF FF FF FF FF FF FF FF 없음. image/png 오류 체크 바이트 뒤에 "PNG", CR LF SUB LF, PNG 시그니처.
    FF D8 FF FF FF FF 없음. image/jpeg JPEG 시작 마커 뒤에 추가 마커를 나타내는 바이트.
  2. undefined를 반환합니다.

6.2. 오디오 또는 비디오 타입 패턴 매칭

어떤 오디오 또는 비디오 MIME 타입 바이트 패턴바이트 시퀀스 input이 일치하는지(있다면) 결정하려면, 다음 오디오 또는 비디오 타입 패턴 매칭 알고리즘을 사용합니다:

  1. 다음 표의 각 row에 대해 다음 단계를 실행합니다:

    1. patternMatched패턴 매칭 알고리즘input, row의 첫 번째 열, 두 번째 열, 세 번째 열의 값으로 실행한 결과로 설정합니다.

    2. patternMatched가 true이면 row의 네 번째 열의 값을 반환합니다.

    바이트 패턴 패턴 마스크 선행 바이트 무시 오디오 또는 비디오 MIME 타입 비고
    46 4F 52 4D 00 00 00 00 41 49 46 46 FF FF FF FF 00 00 00 00 FF FF FF FF 없음. audio/aiff 문자열 "FORM" 뒤에 4개의 바이트가 오고, 그 뒤에 "AIFF", AIFF 시그니처.
    49 44 33 FF FF FF 없음. audio/mpeg 문자열 "ID3", ID3v2 태그가 있는 MP3 시그니처.
    4F 67 67 53 00 FF FF FF FF FF 없음. application/ogg 문자열 "OggS" 뒤에 NUL, Ogg 컨테이너 시그니처.
    4D 54 68 64 00 00 00 06 FF FF FF FF FF FF FF FF 없음. audio/midi 문자열 "MThd" 뒤에 32비트(빅엔디언)로 6을 나타내는 4개의 바이트, MIDI 시그니처.
    52 49 46 46 00 00 00 00 41 56 49 20 FF FF FF FF 00 00 00 00 FF FF FF FF 없음. video/avi 문자열 "RIFF" 뒤에 4개의 바이트가 오고, 그 뒤에 "AVI ", AVI 시그니처.
    52 49 46 46 00 00 00 00 57 41 56 45 FF FF FF FF 00 00 00 00 FF FF FF FF 없음. audio/wave 문자열 "RIFF" 뒤에 4개의 바이트가 오고, 그 뒤에 "WAVE", WAVE 시그니처.
  2. inputMP4 시그니처와 일치하면 "video/mp4"를 반환합니다.

  3. inputWebM 시그니처와 일치하면 "video/webm"를 반환합니다.

  4. inputID3 없는 MP3 시그니처와 일치하면 "audio/mpeg"를 반환합니다.

  5. undefined를 반환합니다.

6.2.1. MP4 시그니처

바이트 시퀀스 MP4 시그니처와 일치하는지 판단하려면 다음 단계를 수행합니다:

  1. sequence를 맞춰볼 바이트 시퀀스로 설정합니다. sequence[s]는 sequence바이트 s이고, sequence[0]은 첫 번째 바이트입니다.
  2. lengthsequence바이트 수로 설정합니다.
  3. length가 12보다 작으면 false를 반환합니다.
  4. box-sizesequence[0]~[3]의 4개 바이트를 32비트 부호 없는 빅엔디언 정수로 해석한 값으로 설정합니다.
  5. lengthbox-size보다 작거나 box-size mod 4가 0이 아니면 false를 반환합니다.
  6. sequence[4]~[7]의 4개 바이트가 0x66 0x74 0x79 0x70 ("ftyp")과 다르면 false를 반환합니다.
  7. sequence[8]~[10]의 3개 바이트가 0x6D 0x70 0x34 ("mp4")와 같으면 true를 반환합니다.
  8. bytes-read를 16으로 설정합니다.

    이것은 "major brand"의 버전 번호에 해당하는 4개의 바이트를 무시합니다.

  9. bytes-readbox-size보다 작은 동안, 계속 반복:
    1. sequence[bytes-read]~[bytes-read+2]의 3개 바이트가 0x6D 0x70 0x34 ("mp4")와 같으면 true를 반환합니다.
    2. bytes-read를 4만큼 증가시킵니다.
  10. false를 반환합니다.

6.2.2. WebM 시그니처

바이트 시퀀스WebM 시그니처와 일치하는지 판단하려면 다음 단계를 수행합니다:

  1. sequence를 맞춰볼 바이트 시퀀스로 설정합니다. sequence[s]는 sequence바이트 s이고, sequence[0]은 첫 번째 바이트입니다.
  2. lengthsequence바이트 수로 설정합니다.
  3. length가 4보다 작으면 false를 반환합니다.
  4. sequence[0]~[3]의 4개 바이트가 0x1A 0x45 0xDF 0xA3와 다르면 false를 반환합니다.
  5. iter를 4로 설정합니다.
  6. iterlength보다 작고 iter가 38보다 작은 동안, 반복:
    1. sequence[iter]~[iter+1]의 두 바이트가 0x42 0x82와 같으면,
      1. iter를 2만큼 증가시킵니다.
      2. iterlength보다 크거나 같으면 이 단계들을 중단합니다.
      3. number sizevint 파싱sequence[iter]에서 시작해 수행한 결과로 설정합니다.
      4. iternumber size만큼 증가시킵니다.
      5. iterlength-4보다 크거나 같으면 이 단계들을 중단합니다.
      6. matched패딩 시퀀스 매칭 0x77 0x65 0x62 0x6D ("webm")을 sequenceiter 오프셋에서 수행한 결과로 설정합니다.
      7. matched가 true이면 이 단계들을 중단하고 true를 반환합니다.
    2. iter를 1만큼 증가시킵니다.
  7. false를 반환합니다.

vint 파싱바이트 시퀀스 sequence(크기 length)의 iter 인덱스에서 시작해 하려면 다음 단계를 따릅니다:

  1. mask를 128로 설정합니다.
  2. max vint length를 8로 설정합니다.
  3. number size를 1로 설정합니다.
  4. index를 0으로 설정합니다.
  5. number sizemax vint length보다 작고, length보다 작은 동안 반복:
    1. sequence[index] & mask가 0이 아니면, 이 단계들을 중단합니다.
    2. maskmask >> 1로 설정합니다.
    3. number size를 1 증가시킵니다.
  6. parsed numbersequence[index] & ~mask로 설정합니다.
  7. index를 1 증가시킵니다.
  8. bytes remainingnumber size - 1로 설정합니다.
  9. bytes remaining이 0이 아닐 때 반복:
    1. parsed numberparsed number << 8로 설정합니다.
    2. parsed numberparsed number | sequence[index]로 설정합니다.
    3. index를 1 증가시킵니다.
    4. indexlength보다 크거나 같으면 이 단계들을 중단합니다.
    5. bytes remaining을 1 감소시킵니다.
  10. parsed numbernumber size를 반환합니다.

패딩 시퀀스 매칭 patternsequenceoffset 바이트에서 시작해 end 바이트에서 끝나도록 한다는 것은 sequenceend보다 큰 길이를 가지며, [offset, end] 범위 내에서 pattern의 바이트가 순서대로 정확히 포함되어 있고, 앞에 0x00 값의 바이트가 올 수 있으면 true, 아니면 false를 반환하는 것을 의미합니다.

6.2.3. ID3 없는 MP3 시그니처

바이트 시퀀스ID3 없는 MP3 시그니처와 일치하는지 판별하려면 다음 단계를 따르세요:

  1. sequence를 비교 대상 바이트 시퀀스로 설정합니다. sequence[s]는 sequence바이트 s이고, sequence[0]은 첫 번째 바이트입니다.
  2. lengthsequence바이트 수로 설정합니다.
  3. s를 0으로 초기화합니다.
  4. MP3 헤더 일치 결과가 false면 false 반환.
  5. MP3 프레임 파싱sequences 오프셋에서 수행합니다.
  6. skipped-bytesMP3 프레임 크기 계산 실행 결과로 설정합니다.
  7. skipped-bytes가 4보다 작거나, skipped-bytess - length보다 크면 false 반환.
  8. s를 skipped-bytes만큼 증가시킵니다.
  9. MP3 헤더 일치 결과가 false면 false 반환, 아니면 true 반환.

MP3 헤더 일치바이트 시퀀스 sequence(길이 length)의 s 오프셋에서 실행하려면 다음 단계를 따르세요:

  1. length가 4보다 작으면 false 반환.
  2. sequence[s]이 0xff가 아니거나 sequence[s + 1] & 0xe0이 0xe0이 아니면 false 반환.
  3. layersequence[s + 1] & 0x06 >> 1의 결과로 설정.
  4. layer가 0이면 false 반환.
  5. bit-ratesequence[s + 2] & 0xf0 >> 4로 설정.
  6. bit-rate가 15면 false 반환.
  7. sample-ratesequence[s + 2] & 0x0c >> 2로 설정.
  8. sample-rate가 3이면 false 반환.
  9. freqsample-rate 테이블에서 sample-rate 인덱스에 해당하는 값으로 설정.
  10. final-layer를 4 - (sequence[s + 1])로 설정.
  11. final-layer & 0x06 >> 1이 3이 아니면 false 반환.
  12. true 반환.

MP3 프레임 크기 계산을 하려면 다음 단계를 따르세요:

  1. version이 1이면 scale을 72로, 아니면 144로 설정.
  2. sizebitrate * scale / freq로 설정.
  3. pad가 0이 아니면 size를 1 증가.
  4. size 반환.

MP3 프레임 파싱을 하려면 다음 단계를 따르세요:

  1. versionsequence[s + 1] & 0x18 >> 3으로 설정.
  2. bitrate-index를 sequence[s + 2] & 0xf0 >> 4로 설정.
  3. version & 0x01이 0이 아니면, bitrate를 mp2.5-rates 테이블에서 bitrate-index 인덱스 값으로 설정.
  4. version & 0x01이 0이면, bitrate를 mp3-rates 테이블에서 bitrate-index 인덱스 값으로 설정.
  5. samplerate-indexsequence[s + 2] & 0x0c >> 2로 설정.
  6. sampleratesample-rate 테이블에서 samplerate-index 인덱스 값으로 설정.
  7. padsequence[s + 2] & 0x02 >> 1로 설정.
mp3-rates 테이블
index mp3-rates
0 0
1 32000
2 40000
3 48000
4 56000
5 64000
6 80000
7 96000
8 112000
9 128000
10 160000
11 192000
12 224000
13 256000
14 320000
mp2.5-rates 테이블
index mp2.5-rates
0 0
1 8000
2 16000
3 24000
4 32000
5 40000
6 48000
7 56000
8 64000
9 80000
10 96000
11 112000
12 128000
13 144000
14 160000
sample-rate 테이블
index samplerate
0 44100
1 48000
2 32000

6.3. 폰트 타입 패턴 매칭

어떤 폰트 MIME 타입 바이트 패턴바이트 시퀀스 input이 일치하는지(있다면) 확인하려면, 다음 폰트 타입 패턴 매칭 알고리즘을 사용합니다:

  1. 아래 표의 각 row에 대해 다음 단계를 실행합니다:

    1. patternMatched패턴 매칭 알고리즘input, row의 첫 번째 열, 두 번째 열, 세 번째 열 값으로 실행한 결과로 설정합니다.

    2. patternMatched가 true이면 row의 네 번째 열 값을 반환합니다.

    바이트 패턴 패턴 마스크 선행 바이트 무시 폰트 MIME 타입 비고
    00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4C 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 없음. application/vnd.ms-fontobject 34 바이트 뒤에 문자열 "LP", Embedded OpenType 시그니처.
    00 01 00 00 FF FF FF FF 없음. font/ttf 4 바이트가 버전 번호 1.0을 나타내는 값, TrueType 시그니처.
    4F 54 54 4F FF FF FF FF 없음. font/otf 문자열 "OTTO", OpenType 시그니처.
    74 74 63 66 FF FF FF FF 없음. font/collection 문자열 "ttcf", TrueType Collection 시그니처.
    77 4F 46 46 FF FF FF FF 없음. font/woff 문자열 "wOFF", Web Open Font Format 1.0 시그니처.
    77 4F 46 32 FF FF FF FF 없음. font/woff2 문자열 "wOF2", Web Open Font Format 2.0 시그니처.
  2. undefined를 반환합니다.

6.4. 아카이브 타입 패턴 매칭

어떤 아카이브 MIME 타입 바이트 패턴바이트 시퀀스 input이 일치하는지(있다면) 확인하려면, 다음 아카이브 타입 패턴 매칭 알고리즘을 사용합니다:

  1. 아래 표의 각 row에 대해 다음 단계를 실행합니다:

    1. patternMatched패턴 매칭 알고리즘input, row의 첫 번째 열, 두 번째 열, 세 번째 열 값으로 실행한 결과로 설정합니다.

    2. patternMatched가 true이면 row의 네 번째 열 값을 반환합니다.

    바이트 패턴 패턴 마스크 선행 바이트 무시 아카이브 MIME 타입 비고
    1F 8B 08 FF FF FF 없음. application/x-gzip GZIP 아카이브 시그니처.
    50 4B 03 04 FF FF FF FF 없음. application/zip 문자열 "PK" 뒤에 ETX EOT, ZIP 아카이브 시그니처.
    52 61 72 21 1A 07 00 FF FF FF FF FF FF FF 없음. application/x-rar-compressed 문자열 "Rar!" 뒤에 SUB BEL NUL, RAR 4.x 아카이브 시그니처.
  2. undefined를 반환합니다.

7. 리소스의 계산된 MIME 타입 결정

리소스계산된 MIME 타입을 결정하기 위해, 사용자 에이전트는 다음 MIME 타입 스니핑 알고리즘을 사용해야 합니다:

  1. 제공된 MIME 타입XML MIME 타입 또는 HTML MIME 타입이면, 계산된 MIME 타입제공된 MIME 타입입니다.

    이 단계를 중단합니다.

  2. 제공된 MIME 타입이 정의되지 않았거나, 제공된 MIME 타입essence가 "unknown/unknown", "application/unknown", 또는 "*/*"이면, 알 수 없는 MIME 타입 식별 규칙sniff-scriptable flagno-sniff flag의 반대로 하여 실행하고 이 단계를 중단합니다.
  3. no-sniff flag가 설정되어 있으면, 계산된 MIME 타입제공된 MIME 타입입니다.

    이 단계를 중단합니다.

  4. apache 버그 검사 플래그가 설정되어 있으면, 리소스가 텍스트인지 바이너리인지 구분하는 규칙을 실행하고 이 단계를 중단합니다.
  5. 제공된 MIME 타입이미지 MIME 타입이고, 사용자 에이전트가 지원함이면, matched-type이미지 타입 패턴 매칭 알고리즘리소스 헤더바이트 시퀀스로 하여 실행한 결과로 설정합니다.
  6. matched-type이 undefined가 아니면, 계산된 MIME 타입matched-type입니다.

    이 단계를 중단합니다.

  7. 제공된 MIME 타입오디오 또는 비디오 MIME 타입이고, 사용자 에이전트가 지원함이면, matched-type오디오 또는 비디오 타입 패턴 매칭 알고리즘리소스 헤더바이트 시퀀스로 하여 실행한 결과로 설정합니다.
  8. matched-type이 undefined가 아니면, 계산된 MIME 타입matched-type입니다.

    이 단계를 중단합니다.

  9. 계산된 MIME 타입제공된 MIME 타입입니다.

7.1. 알 수 없는 MIME 타입 리소스 식별

스크립트 가능 MIME 타입 스니핑 플래그알 수 없는 MIME 타입 식별 규칙에서 스크립트 가능 MIME 타입을 스니핑할지 여부를 결정하는 데 사용됩니다.

알 수 없는 MIME 타입 식별 규칙을 호출할 때 스크립트 가능 MIME 타입 스니핑 플래그의 설정이 명시되지 않으면, 스크립트 가능 MIME 타입 스니핑 플래그는 기본적으로 미설정이어야 합니다.

알 수 없는 MIME 타입을 가진 리소스 resource계산된 MIME 타입을 결정하려면 다음 알 수 없는 MIME 타입 식별 규칙을 실행합니다:

  1. 스크립트 가능 MIME 타입 스니핑 플래그가 설정되어 있다면, 다음 표의 각 row에 대해 다음 단계를 실행합니다:

    1. patternMatched패턴 매칭 알고리즘resource리소스 헤더, row의 첫 번째 열, 두 번째 열, 세 번째 열 값으로 실행한 결과로 설정합니다.

    2. patternMatched가 true이면 row의 네 번째 열 값을 반환합니다.

    바이트 패턴 패턴 마스크 선행 바이트 무시 계산된 MIME 타입 비고
    3C 21 44 4F 43 54 59 50 45 20 48 54 4D 4C TT FF FF DF DF DF DF DF DF DF FF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<!DOCTYPE HTML" 뒤에 태그 종료 바이트.
    3C 48 54 4D 4C TT FF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<HTML" 뒤에 태그 종료 바이트.
    3C 48 45 41 44 TT FF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<HEAD" 뒤에 태그 종료 바이트.
    3C 53 43 52 49 50 54 TT FF DF DF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<SCRIPT" 뒤에 태그 종료 바이트.
    3C 49 46 52 41 4D 45 TT FF DF DF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<IFRAME" 뒤에 태그 종료 바이트.
    3C 48 31 TT FF DF FF FF 공백 바이트. text/html 대소문자 구분 없이 "<H1" 뒤에 태그 종료 바이트.
    3C 44 49 56 TT FF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<DIV" 뒤에 태그 종료 바이트.
    3C 46 4F 4E 54 TT FF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<FONT" 뒤에 태그 종료 바이트.
    3C 54 41 42 4C 45 TT FF DF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<TABLE" 뒤에 태그 종료 바이트.
    3C 41 TT FF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<A" 뒤에 태그 종료 바이트.
    3C 53 54 59 4C 45 TT FF DF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<STYLE" 뒤에 태그 종료 바이트.
    3C 54 49 54 4C 45 TT FF DF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<TITLE" 뒤에 태그 종료 바이트.
    3C 42 TT FF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<B" 뒤에 태그 종료 바이트.
    3C 42 4F 44 59 TT FF DF DF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<BODY" 뒤에 태그 종료 바이트.
    3C 42 52 TT FF DF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<BR" 뒤에 태그 종료 바이트.
    3C 50 TT FF DF FF 공백 바이트. text/html 대소문자 구분 없이 "<P" 뒤에 태그 종료 바이트.
    3C 21 2D 2D TT FF FF FF FF FF 공백 바이트. text/html 문자열 "<!--" 뒤에 태그 종료 바이트.
    3C 3F 78 6D 6C FF FF FF FF FF 공백 바이트. text/xml 문자열 "<?xml".
    25 50 44 46 2D FF FF FF FF FF 없음. application/pdf 문자열 "%PDF-", PDF 시그니처.
  2. 다음 표의 각 row에 대해 다음 단계를 실행합니다:

    1. patternMatched패턴 매칭 알고리즘resource리소스 헤더, row의 첫 번째 열, 두 번째 열, 세 번째 열 값으로 실행한 결과로 설정합니다.

    2. patternMatched가 true이면 row의 네 번째 열 값을 반환합니다.

    바이트 패턴 패턴 마스크 선행 바이트 무시 계산된 MIME 타입 비고
    25 21 50 53 2D 41 64 6F 62 65 2D FF FF FF FF FF FF FF FF FF FF FF 없음. application/postscript 문자열 "%!PS-Adobe-", PostScript 시그니처.
    FE FF 00 00 FF FF 00 00 없음. text/plain UTF-16BE BOM
    FF FE 00 00 FF FF 00 00 없음. text/plain UTF-16LE BOM
    EF BB BF 00 FF FF FF 00 없음. text/plain UTF-8 BOM

    사용자 에이전트는 추가 MIME 타입 지원을 위해 이 표를 암묵적으로 확장할 수 있습니다.

    단, 사용자 에이전트는 이 표에 이미 존재하는 계산된 MIME 타입에 대해 추가 바이트 패턴을 암묵적으로 확장해서는 안 됩니다. 이는 권한 상승 취약점을 유발할 수 있습니다.

    사용자 에이전트는 이 표를 확장할 때 어떠한 권한 상승 취약점도 도입해서는 안 됩니다.

  3. matchedType이미지 타입 패턴 매칭 알고리즘resource리소스 헤더로 하여 실행한 결과로 설정합니다.

  4. matchedType이 undefined가 아니면 matchedType을 반환합니다.

  5. matchedType오디오 또는 비디오 타입 패턴 매칭 알고리즘resource리소스 헤더로 하여 실행한 결과로 설정합니다.

  6. matchedType이 undefined가 아니면 matchedType을 반환합니다.

  7. matchedType아카이브 타입 패턴 매칭 알고리즘resource리소스 헤더로 하여 실행한 결과로 설정합니다.

  8. matchedType이 undefined가 아니면 matchedType을 반환합니다.

  9. resource리소스 헤더바이너리 데이터 바이트가 없다면, "text/plain"을 반환합니다.

  10. "application/octet-stream"을 반환합니다.

7.2. 잘못 라벨링된 바이너리 리소스 스니핑

바이너리 리소스가 일반 텍스트로 잘못 라벨링되었는지 판단하려면, 다음 텍스트/바이너리 구분 규칙을 실행합니다:

  1. length바이트 수로 설정합니다 (리소스 헤더 기준).
  2. length가 2 이상이고 리소스 헤더의 첫 2바이트가 0xFE 0xFF (UTF-16BE BOM) 또는 0xFF 0xFE (UTF-16LE BOM)이면 계산된 MIME 타입은 "text/plain"입니다.

    이 단계를 중단합니다.

  3. length가 3 이상이고 리소스 헤더의 첫 3바이트가 0xEF 0xBB 0xBF (UTF-8 BOM)이면 계산된 MIME 타입은 "text/plain"입니다.

    이 단계를 중단합니다.

  4. 리소스 헤더바이너리 데이터 바이트가 없으면 계산된 MIME 타입은 "text/plain"입니다.

    이 단계를 중단합니다.

  5. 계산된 MIME 타입은 "application/octet-stream"입니다.

    텍스트/바이너리 구분 규칙계산된 MIME 타입스크립트 가능 MIME 타입으로 결정해서는 안 됩니다. 이는 권한 상승 공격을 허용할 수 있습니다.

8. 문맥 특화 스니핑

문맥이란 ….

특정 문맥에서는 일부 MIME 타입의 부분집합에 속하는 리소스만 식별하는 것이 유용할 수 있습니다.

이러한 문맥에서는 MIME 타입 스니핑 알고리즘 대신 문맥 특화 스니핑 알고리즘을 사용하여 리소스계산된 MIME 타입을 결정하는 것이 적절합니다.

문맥 특화 스니핑 알고리즘리소스가 특정 문맥에 관계된 MIME 타입일 때만 계산된 MIME 타입을 결정합니다.

8.1. 브라우징 문맥에서의 스니핑

MIME 타입 스니핑 알고리즘을 사용합니다.

8.2. 이미지 문맥에서의 스니핑

이미지 MIME 타입을 가진 리소스계산된 MIME 타입을 결정하려면, 다음 이미지 특화 스니핑 규칙을 실행합니다:

  1. 제공된 MIME 타입XML MIME 타입이면 계산된 MIME 타입제공된 MIME 타입입니다.

    이 단계를 중단합니다.

  2. image-type-matched이미지 타입 패턴 매칭 알고리즘리소스 헤더바이트 시퀀스로 하여 실행한 결과로 설정합니다.
  3. image-type-matched가 undefined가 아니면 계산된 MIME 타입image-type-matched입니다.

    이 단계를 중단합니다.

  4. 계산된 MIME 타입제공된 MIME 타입입니다.

8.3. 오디오/비디오 문맥에서의 스니핑

오디오 또는 비디오 MIME 타입을 가진 리소스계산된 MIME 타입을 결정하려면, 다음 오디오/비디오 특화 스니핑 규칙을 실행합니다:

  1. 제공된 MIME 타입XML MIME 타입이면 계산된 MIME 타입제공된 MIME 타입입니다.

    이 단계를 중단합니다.

  2. audio-or-video-type-matched오디오 또는 비디오 타입 패턴 매칭 알고리즘리소스 헤더바이트 시퀀스로 하여 실행한 결과로 설정합니다.
  3. audio-or-video-type-matched가 undefined가 아니면 계산된 MIME 타입audio-or-video-type-matched입니다.

    이 단계를 중단합니다.

  4. 계산된 MIME 타입제공된 MIME 타입입니다.

8.4. 플러그인 문맥에서의 스니핑

플러그인 문맥에서 가져온 리소스계산된 MIME 타입을 결정하려면, 다음 플러그인 문맥 특화 스니핑 규칙을 실행합니다:

  1. 제공된 MIME 타입이 정의되지 않았으면 계산된 MIME 타입은 "application/octet-stream"입니다.
  2. 계산된 MIME 타입제공된 MIME 타입입니다.

8.5. 스타일 문맥에서의 스니핑

스타일 문맥에서 가져온 리소스계산된 MIME 타입을 결정하려면, 다음 스타일 문맥 특화 스니핑 규칙을 실행합니다:

  1. 제공된 MIME 타입이 정의되지 않았으면 ….
  2. 계산된 MIME 타입제공된 MIME 타입입니다.

8.6. 스크립트 문맥에서의 스니핑

스크립트 문맥에서 가져온 리소스계산된 MIME 타입을 결정하려면, 다음 스크립트 문맥 특화 스니핑 규칙을 실행합니다:

  1. 제공된 MIME 타입이 정의되지 않았으면 ….
  2. 계산된 MIME 타입제공된 MIME 타입입니다.

8.7. 폰트 문맥에서의 스니핑

폰트 MIME 타입을 가진 리소스계산된 MIME 타입을 결정하려면, 다음 폰트 특화 스니핑 규칙을 실행합니다:

  1. 제공된 MIME 타입XML MIME 타입이면 계산된 MIME 타입제공된 MIME 타입입니다.

    이 단계를 중단합니다.

  2. font-type-matched폰트 타입 패턴 매칭 알고리즘리소스 헤더바이트 시퀀스로 하여 실행한 결과로 설정합니다.
  3. font-type-matched가 undefined가 아니면 계산된 MIME 타입font-type-matched입니다.

    이 단계를 중단합니다.

  4. 계산된 MIME 타입제공된 MIME 타입입니다.

8.8. 텍스트 트랙 문맥에서의 스니핑

계산된 MIME 타입은 "text/vtt"입니다.

8.9. 캐시 매니페스트 문맥에서의 스니핑

계산된 MIME 타입은 "text/cache-manifest"입니다.

감사의 말

이 문서의 이전 버전을 관리해주신 Adam Barth와 Ian Hickson께 특별히 감사드립니다.

또한 Alfred Hönes, Andreu Botella, Anne van Kesteren, Ben Eidson, Boris Zbarsky, Darien Maillet Valentine, David Singer, Domenic Denicola, Henri Sivonen, Jean-Yves Avenard, Jonathan Neal, Joshua Cranmer, Larry Masinter, 罗泽轩, Mariko Kosaka, Mark Pilgrim, Paul Adenot, Peter Occil, Rob Buis, Russ Cox, Simon Pieters, 그리고 triple-underscore 모두 소중한 기여에 감사드립니다.

이 현행 표준은 Gordon P. Hemsley (me@gphemsley.org)가 작성하였습니다.

지적 재산권

Copyright © WHATWG (Apple, Google, Mozilla, Microsoft). 본 저작물은 크리에이티브 커먼즈 저작자표시 4.0 국제 라이선스에 따라 라이선스가 부여되어 있습니다. 소스 코드에 일부가 포함된 경우, 해당 부분은 BSD 3-Clause License로 라이선스가 부여됩니다.

이 문서는 현행 표준입니다. 특허 검토 버전에 관심이 있으신 분은 현행 표준 검토 초안을 참조하시기 바랍니다.

색인

이 명세서에서 정의된 용어

참조로 정의된 용어

참고 문헌

규범적 참고 문헌

[ENCODING]
Anne van Kesteren. Encoding Standard. 현행 표준. URL: https://encoding.spec.whatwg.org/
[FETCH]
Anne van Kesteren. Fetch Standard. 현행 표준. URL: https://fetch.spec.whatwg.org/
[HTTP-SEMANTICS]
R. Fielding, Ed.; M. Nottingham, Ed.; J. Reschke, Ed.. HTTP Semantics. 2022년 6월. 인터넷 표준. URL: https://httpwg.org/specs/rfc9110.html
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. 현행 표준. URL: https://infra.spec.whatwg.org/
[KEYWORDS]
S. Bradner. Key words for use in RFCs to Indicate Requirement Levels. 1997년 3월. 최선의 현재 관행. URL: https://datatracker.ietf.org/doc/html/rfc2119
[MIMETYPE]
N. Freed; N. Borenstein. Multipurpose Internet Mail Extensions (MIME) Part Two: Media Types. 1996년 11월. 초안 표준. URL: https://www.rfc-editor.org/rfc/rfc2046

참고용 참고 문헌

[FTP]
J. Postel; J. Reynolds. File Transfer Protocol. 1985년 10월. 인터넷 표준. URL: https://www.rfc-editor.org/rfc/rfc959
[HTML]
Anne van Kesteren; et al. HTML Standard. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[MEDIAQUERIES]
Florian Rivoal; Tab Atkins Jr.. Media Queries Level 4. URL: https://drafts.csswg.org/mediaqueries-4/
[RFC7303]
H. Thompson; C. Lilley. XML Media Types. 2014년 7월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc7303
[RFC8081]
C. Lilley. The "font" Top-Level Media Type. 2017년 2월. 제안 표준. URL: https://www.rfc-editor.org/rfc/rfc8081
[SECCONTSNIFF]
Adam Barth; Juan Caballero; Dawn Song. Secure Content Sniffing for Web Browsers, or How to Stop Papers from Reviewing Themselves. 2009년 5월. URL: https://www.adambarth.com/papers/2009/barth-caballero-song.pdf