입력 이벤트 레벨 2

W3C 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/WD-input-events-2-20250814/
최신 공개 버전:
https://www.w3.org/TR/input-events-2/
최신 편집자 초안:
https://w3c.github.io/input-events/
히스토리:
https://www.w3.org/standards/history/input-events-2/
커밋 히스토리
편집자:
(초청 전문가)
이전 편집자:
Ben Peters (Microsoft) -
피드백:
GitHub w3c/input-events (풀 리퀘스트, 새 이슈, 오픈 이슈)
public-editing-tf@w3.org 제목 [input-events-2] … 메시지 주제 … (아카이브)
레벨별 최신 공개 버전
레벨 2
레벨별 최신 편집자 초안
레벨 2

요약

이 명세는 텍스트 및 관련 입력 이벤트에 대한 확장 기능을 정의하여, 텍스트 편집기 애플리케이션 및 텍스트 입력과 서식을 처리하는 기타 애플리케이션에서 기본 브라우저 동작을 모니터링하고 조작할 수 있도록 합니다. 이 명세는 UI 이벤트 명세 [UI-EVENTS]를 기반으로 합니다.

이 문서의 상태

이 섹션은 본 문서가 공개된 시점의 상태를 설명합니다. 현재 W3C 출판물 목록과 이 기술 보고서의 최신 개정본은 W3C 표준 및 초안 색인에서 확인할 수 있습니다.

입력 이벤트 레벨 2는 Input Events의 첫 번째 버전 [INPUT-EVENTS]을 대체하며 다음을 포함합니다:

입력 이벤트 명세를 위한 테스트 스위트구현 보고서는 아직 작업 중입니다.

이 문서는 웹 편집 작업 그룹에서 권고안 트랙을 사용하여 작업 초안으로 발행되었습니다.

작업 초안으로 발행된 것은 W3C 및 회원의 지지를 의미하지 않습니다.

이 문서는 초안이며 언제든지 업데이트, 대체, 또는 폐기될 수 있습니다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절합니다.

이 문서는 W3C 특허 정책에 따라 운영되는 그룹에 의해 작성되었습니다. W3C공개 특허 공개 목록을 유지합니다. 이 목록에는 그룹 산출물과 관련하여 제출된 특허 공개가 있으며, 특허 공개 방법에 대한 지침도 포함되어 있습니다. 개인이 특정 특허가 필수 청구항을 포함한다고 판단할 경우, W3C 특허 정책 6절에 따라 정보를 공개해야 합니다.

이 문서는 2023년 11월 3일 W3C 프로세스 문서를 따릅니다.

1. 소개

이 문서는 편집과 관련된 2가지 이벤트 - inputbeforeinput에 대한 확장 사항을 설명하며, 이는 UI 이벤트 명세 [UI-EVENTS]에 정의되어 있습니다. 이러한 이벤트의 목적은 저자가 편집이 발생하기 전후에 기본 편집 동작을 이해하거나 재정의할 수 있도록 하는 것입니다.

2. 적합성

비규범적으로 표시된 섹션뿐만 아니라, 이 명세서의 모든 작성 지침, 다이어그램, 예시, 참고 사항은 비규범적입니다. 그 외의 모든 내용은 규범적입니다.

이 문서에서 MAY, MUST, MUST NOT라는 핵심 단어는 BCP 14 [RFC2119] [RFC8174] 에서 설명된 대로, 이와 같이 모두 대문자로 표시된 경우에만 해당 의미로 해석되어야 합니다.

3. 정의

의도 표현
사용자는 키보드, IME, 음성 또는 유사한 방법을 통해 특정 편집 작업을 실행하려는 의도를 표현할 수 있습니다. 특정 입력 동작은 플랫폼별 관례에 따라 의도와 매핑됩니다.
킬 버퍼

이 정의는 규범적이지 않습니다.

킬 버퍼는 클립보드와 분리된 리치텍스트 콘텐츠의 메모리 저장소로, 특정 삭제 명령을 통해 삭제된 콘텐츠를 임시 저장할 수 있습니다. 사용자는 킬 버퍼에 저장된 콘텐츠로 현재 선택 영역을 yank 명령을 통해 대체할 수 있습니다.

4. 해결된 문제

이 섹션은 규범적이지 않습니다.

웹 기반 텍스트 에디터를 만들기 위해서는 브라우저 코드 외에도 상당한 양의 JavaScript가 필요합니다. 그 이유는 다음과 같습니다:

  1. 브라우저마다 모든 편집 작업을 동일하게 처리하지 않습니다.
  2. 브라우저가 특정 편집 작업을 처리하는 방식에 종종 버그가 있습니다.
  3. 각 사이트는 특정 편집 작업을 처리하는 방식에 대해 사용자 지정 선호도를 가질 수 있습니다.
  4. 브라우저에서 고급 텍스트 편집 기능 개발은 Extensible Web Manifesto에 명시된 원칙을 따르지 않았으며, 이러한 기능 개발이 웹 개발자 커뮤니티의 요구와 항상 조율되어 이루어진 것은 아닙니다.

이 명세는 웹 개발자가 beforeinput 이벤트를 통해 텍스트 편집과 관련된 모든 사용자 입력에 대한 브라우저 처리 방식을 재정의하고, input 이벤트를 통해 사용자 입력으로 인해 브라우저가 DOM에 변경한 내용을 모니터링할 수 있는 간단한 방법을 제공하여 이러한 문제를 완화하고자 합니다.

5. 사용 사례

이 섹션은 규범적이지 않습니다.

  1. 모든 브라우저에 접근할 수 없는 상황에서 사용자가 텍스트를 굵게 표시할 때 <b> 태그 대신 <strong> 태그를 사용하는 JavaScript 텍스트 에디터 만들기.
  2. JavaScript가 편집된 텍스트 변경 사항을 DOM에 렌더링하는 백엔드 데이터 모델과 함께 동작하는 JavaScript 텍스트 에디터 만들기.
  3. JavaScript 에디터에서 일부 리치텍스트 편집만 허용(예: 굵게만 허용, 이탤릭은 허용하지 않음).
  4. 사용자들이 각기 다른 브라우저에서 의도를 표현하는 방식이 다르더라도 JavaScript가 사용자 의도에 따라 DOM 변경 사항을 렌더링하는 협업 에디터 만들기.
  5. 일부 사용자는 텍스트 추가·삭제만 가능하고, 다른 사용자는 특정 서식만 추가·삭제할 수 있는 다양한 사용자 접근 옵션을 가진 JavaScript 에디터 만들기.

6. 입력 이벤트 타입

입력 이벤트는 사용자가 마크업을 편집하려고 시도하기 전(beforeinput 이벤트)과 후(input 이벤트)에 전송됩니다. 여기에는 콘텐츠 삽입 및 삭제, 서식 변경이 포함됩니다.

입력 이벤트는 디스패치되어 편집 호스트 역할을 하는 요소(예: contenteditable 속성이 설정된 요소, textarea 요소, input 요소 중 텍스트 입력이 허용되는 요소)에서 발생합니다.

6.1 InputEvent 인터페이스

WebIDLpartial interface InputEvent {
   readonly attribute DataTransfer? dataTransfer;
   sequence<StaticRange> getTargetRanges();
};

partial dictionary InputEventInit {
   DataTransfer? dataTransfer = null;
   sequence<StaticRange> targetRanges = [];
};

inputType, dataTransfertargetRanges 속성은 InputEventInit 객체의 해당 속성을 초기화합니다.

6.1.1 개요

이 섹션은 규범적이지 않습니다.

아래 표는 datadataTransfer 속성에 값이 들어있는 경우와 null인 경우, 그리고 getTargetRanges() 메서드가 inputType에 따라 빈 배열 또는 비어있지 않은 배열을 반환하는 경우를 요약합니다.

편집 호스트 inputType data dataTransfer getTargetRanges()
Contenteditable "insertText", "insertCompositionText", "formatSetBlockTextDirection", "formatSetInlineTextDirection", "formatBackColor", "formatFontColor", "formatFontName", "insertLink" 있음 null 비어있지 않은 배열
Contenteditable "insertFromPaste", "insertFromPasteAsQuotation", "insertFromDrop", "insertReplacementText", "insertFromYank" null 있음 비어있지 않은 배열
<textarea>, <input type="text"> "insertText", "insertCompositionText", "insertFromPaste", "insertFromPasteAsQuotation", "insertFromDrop", "insertReplacementText", "insertFromYank", "formatSetBlockTextDirection", "formatSetInlineTextDirection", "formatBackColor", "formatFontColor", "formatFontName", "insertLink" 있음 null 빈 배열
모든 호스트 "historyUndo", "historyRedo" null null 빈 배열
Contenteditable 나머지 모두 null null 비어있지 않은 배열
<textarea>, <input type="text"> 나머지 모두 null null 빈 배열

6.1.2 속성

beforeinput 이벤트의 취소 가능성은 inputType에 따라 달라집니다.

선택되는 inputType은 사용자의 의도 표현, IME 조합 중 편집이 이루어지는지 여부, 그리고 선택 상태에 따라 결정됩니다.

이 명세서에서는 아래 표의 inputType 열의 값을 inputType 값으로 정의합니다.

inputType 사용자의 의도 표현 IME 조합의 일부 beforeinput 취소 가능 선택 상태
"insertText" 입력한 평문 텍스트 삽입 아니오 임의
"insertReplacementText" 맞춤법 검사기, 자동 교정, 오타 제안 등으로 기존 콘텐츠 삽입 또는 교체 아니오 임의
"insertLineBreak" 줄 바꿈 삽입 아니오 임의
"insertParagraph" 단락 구분 삽입 아니오 임의
"insertOrderedList" 번호 매김 목록 삽입 아니오 임의
"insertUnorderedList" 글머리표 목록 삽입 아니오 임의
"insertHorizontalRule" 수평선 삽입 아니오 임의
"insertFromYank" 현재 선택 영역을 킬 버퍼에 저장된 콘텐츠로 대체 아니오 임의
"insertFromDrop" 드롭으로 콘텐츠 삽입 아니오 임의
"insertFromPaste" 클립보드에서 콘텐츠 붙여넣기 또는 클라이언트 이미지 라이브러리에서 이미지 붙여넣기 아니오 임의
"insertFromPasteAsQuotation" 클립보드에서 콘텐츠를 인용으로 붙여넣기 아니오 임의
"insertTranspose" 마지막으로 입력한 두 그래프 클러스터 교환 아니오 임의
"insertCompositionText" 현재 조합 문자열 대체 아니오 임의
"insertLink" 링크 삽입 아니오 임의
"deleteWordBackward" 캐럿 위치 바로 앞의 단어 삭제 아니오 축소됨
"deleteWordForward" 캐럿 위치 바로 뒤의 단어 삭제 아니오 축소됨
"deleteSoftLineBackward" 캐럿 위치에서 가장 가까운 시각적 줄 바꿈 전까지 삭제 아니오 축소됨
"deleteSoftLineForward" 캐럿 위치에서 가장 가까운 시각적 줄 바꿈 후까지 삭제 아니오 축소됨
"deleteEntireSoftLine" 캐럿 위치 전후의 가장 가까운 시각적 줄 바꿈 사이 전체 삭제 아니오 축소됨
"deleteHardLineBackward" 캐럿 위치에서 가장 가까운 블록 요소 또는 br 요소 전까지 삭제 아니오 축소됨
"deleteHardLineForward" 캐럿 위치에서 가장 가까운 블록 요소 또는 br 요소 후까지 삭제 아니오 축소됨
"deleteByDrag" 드래그로 DOM에서 콘텐츠 제거 아니오 임의
"deleteByCut" 잘라내기의 일환으로 현재 선택 영역 제거 아니오 임의
"deleteContent" 삭제 방향을 지정하지 않고 선택 영역을 삭제하며, 이 의도가 다른 inputType에 포함되지 않은 경우 아니오 축소되지 않음
"deleteContentBackward" 캐럿 바로 앞의 콘텐츠를 삭제하며, 이 의도가 다른 inputType에 포함되지 않거나 삭제 후 선택이 시작 위치로 축소되는 경우 아니오 임의
"deleteContentForward" 캐럿 바로 뒤의 콘텐츠를 삭제하며, 이 의도가 다른 inputType에 포함되지 않거나 삭제 후 선택이 끝 위치로 축소되는 경우 아니오 임의
"historyUndo" 마지막 편집 작업 실행 취소 아니오 임의
"historyRedo" 마지막 취소된 편집 작업 다시 실행 아니오 임의
"formatBold" 굵게 서식 시작 아니오 임의
"formatItalic" 이탤릭 서식 시작 아니오 임의
"formatUnderline" 밑줄 서식 시작 아니오 임의
"formatStrikeThrough" 취소선 서식 시작 아니오 임의
"formatSuperscript" 위 첨자 서식 시작 아니오 임의
"formatSubscript" 아래 첨자 서식 시작 아니오 임의
"formatJustifyFull" 현재 선택 영역 전체 정렬 아니오 임의
"formatJustifyCenter" 현재 선택 영역 가운데 정렬 아니오 임의
"formatJustifyRight" 현재 선택 영역 오른쪽 정렬 아니오 임의
"formatJustifyLeft" 현재 선택 영역 왼쪽 정렬 아니오 임의
"formatIndent" 현재 선택 영역 들여쓰기 아니오 임의
"formatOutdent" 현재 선택 영역 내어쓰기 아니오 임의
"formatRemove" 현재 선택 영역의 모든 서식 제거 아니오 임의
"formatSetBlockTextDirection" 텍스트 블록 방향 설정 아니오 임의
"formatSetInlineTextDirection" 텍스트 인라인 방향 설정 아니오 임의
"formatBackColor" 배경색 변경 아니오 임의
"formatFontColor" 글자색 변경 아니오 임의
"formatFontName" 글꼴 변경 아니오 임의
참고
다른 명세에서 이 정의를 확장할 수 있습니다.
참고
위의 inputTypes가 모두 지원된다는 의미는 아닙니다. 특정 브라우저가 DOM 변경을 초래할 수 있는 편집 작업을 지원한다면 반드시 해당 beforeinputinput 이벤트를 발생시켜야 합니다.
참고
선택이 축소된 경우, "deleteContentBackward"는 사용자가 텍스트 노드 내에서 텍스트 삭제를 요청할 때뿐만 아니라 더 복잡한 요소 삭제 또는 문단 병합 의도가 있을 때(캐럿이 텍스트 노드 시작에 있을 때)에도 사용됩니다.
참고
선택이 축소된 경우, "deleteContentForward"는 사용자가 텍스트 노드 내에서 텍스트 삭제를 요청할 때뿐만 아니라 더 복잡한 요소 삭제 또는 문단 병합 의도가 있을 때(캐럿이 텍스트 노드 끝에 있을 때)에도 사용됩니다.

data 속성은 문서에 추가될 평문 데이터 정보를 담고 있습니다.

inputType 편집 호스트 data
"insertText" 또는 "insertCompositionText" 임의 삽입될 평문 문자열
"insertFromPaste", "insertFromPasteAsQuotation", "insertFromDrop", "insertTranspose", "insertReplacementText" 또는 "insertFromYank" input 또는 textarea 삽입될 평문 문자열
"formatSetInlineTextDirection" 또는 "formatSetBlockTextDirection" 임의 "ltr", "rtl", "auto" 또는 "null"
"formatBackColor" 또는 "formatFontColor" 임의 제안된 색상의 CSS 컴포넌트 값 직렬화 문자열 [CSSOM]
"formatFontName" 임의 font-family CSS 속성의 제안 값
"insertLink" 임의 제안된 링크의 url
나머지 모두 임의 null

dataTransfer 속성은 관련 데이터가 있을 경우 DataTransfer 객체에서 문서에 추가되거나 가져올 리치텍스트 및 평문 데이터 정보를 담고 있습니다.

inputType 편집 호스트 dataTransfer
"insertFromPaste", "insertFromPasteAsQuotation", "insertFromDrop", "insertTranspose", "insertReplacementText" 또는 "insertFromYank" contenteditable 사전 채워진 DataTransfer 객체로서:
  1. DataTransfer 객체의 drag data store읽기 전용 모드입니다. [HTML]
  2. 붙여넣는 콘텐츠가 파일일 경우, DataTransfer 객체의 drag data store item list에는 drag data item type string이 파일의 MIME 타입인 항목이 하나 있으며, kindFile이고, 데이터는 붙여넣는 파일에 해당하는 File 객체입니다. [HTML]
  3. DataTransfer 객체의 drag data store item list에는 drag data item type string"text/html"인 항목이 하나 있으며, kindPlain Unicode string이고, 데이터는 클립보드 또는 킬 버퍼에 있는 콘텐츠의 HTML 표현이며, 드롭 또는 추가될 콘텐츠입니다. [HTML]
  4. DataTransfer 객체의 drag data store item list에는 drag data item type string"text/plain"인 항목이 하나 있으며, kindPlain Unicode string이고, 데이터는 붙여넣기, 드롭 등으로 추가될 콘텐츠의 평문 표현입니다. [HTML]
  5. 붙여넣을 콘텐츠가 링크일 경우, DataTransfer 객체의 drag data store item list에는 drag data item type string"text/uri-list"인 항목이 하나 있으며, kindPlain Unicode string이고, 데이터는 드롭 또는 추가될 링크의 평문 표현입니다. [HTML]
나머지 모두 임의 null

getTargetRanges()는 이벤트가 취소되지 않으면 이벤트가 수정할 콘텐츠를 나타내는 StaticRanges 배열을 반환하며, 편집 호스트가 contenteditable 노드 또는 EditContext 편집 호스트인 경우에 해당합니다. 그 외에는 아무것도 반환하지 않습니다. 반환되는 StaticRanges는 브라우저가 일반적으로 교체할 코드 포인트만을 반드시 포함해야 하며, 코드 포인트가 그래프 클러스터 일부일지라도 해당합니다.

참고

이 참고는 규범적이지 않습니다.

스크립트와 플랫폼에 따라, 축소된 선택 상태에서 텍스트 노드에서 앞이나 뒤로 삭제할 때 한 개 혹은 여러 개 코드 포인트 또는 전체 그래프 클러스터가 영향을 받을 수 있습니다. 예를 들어, “café”가 포함된 텍스트 노드에서 뒤로 삭제하면 스크립트와 플랫폼에 따라 “é” 전체 또는 악센트만 삭제될 수 있습니다.

6.1.3 메서드

inputType 편집 호스트 getTargetRanges()의 응답
"historyUndo" 또는 "historyRedo" 임의 빈 배열
나머지 모두 contenteditable 이벤트와 연결된 StaticRanges [DOM] 배열
나머지 모두 input 또는 textarea 빈 배열

inputType이 "historyUndo" 또는 "historyRedo"이거나 편집 호스트가 contenteditable 요소가 아닌 경우에는 빈 배열을 반환합니다. 그렇지 않은 경우 배열을 반환합니다.

6.2 이벤트 정의

beforeinput
타입 beforeinput
인터페이스 InputEvent
동기/비동기 동기
버블링
신뢰된 타겟 편집 호스트인 모든 Element
기본 동작 [UI-EVENTS]
컨텍스트
(신뢰된 이벤트)

사용자 에이전트는 사용자가 contenteditable 요소에 입력을 시도하면 반드시 이 이벤트를 디스패치해야 합니다. 반드시 사용자 에이전트가 DOM을 업데이트한다는 의미는 아닙니다.

사용자 에이전트는 사용자가 입력을 시도하지 않은 이벤트(예: 시스템 이벤트)로 인해 이 이벤트를 디스패치해서는 안 됩니다.

input
타입 input
인터페이스 InputEvent
동기/비동기 동기
버블링
신뢰된 타겟 contenteditable 속성이 활성화된 모든 Element
기본 동작 [UI-EVENTS] 없음
컨텍스트
(신뢰된 이벤트)
  • InputEvent.data: 요소에 추가된 데이터를 포함하는 문자열. 해당하지 않는 경우 null일 수 있음.
  • InputEvent.dataTransfer: 요소에 추가 또는 제거된 리치텍스트 데이터. 해당하지 않는 경우 null일 수 있음.

사용자 에이전트는 사용자가 문서 내용을 변경하려는 의도를 표현하고 브라우저가 이를 처리하여 DOM이 업데이트된 직후 반드시 이 이벤트를 디스패치해야 합니다. 브라우저가 DOM을 변경하지 않은 경우, 예를 들어 편집 호스트가 EditContext 편집 호스트이거나(자동 DOM 변경을 하지 않음), 사용자 에이전트가 DOM 변경이 필요 없다고 판단한 경우에는 반드시 이 이벤트를 디스패치해서는 안 됩니다.

7. 조합 중 입력 이벤트 순서

조합의 시작은 compositionstart 이벤트를 디스패치하여 표시됩니다.

조합 세션 동안 텍스트 조합 시스템이 활성 텍스트 구절을 업데이트할 때마다 compositionupdate 이벤트가 디스패치됩니다.

compositionupdate 이벤트 이후에 beforeinputinput 이벤트 쌍이 디스패치됩니다. beforeinputinput 이벤트는:

활성 텍스트 구절의 DOM 내용은 beforeinput 이벤트가 디스패치된 후, input 이벤트가 디스패치되기 전에 업데이트됩니다.

조합 세션의 끝은 compositionend 이벤트를 디스패치하여 표시됩니다.

8. "insertFromPaste" 사용 시 이벤트 순서

"insertFromPaste" beforeinput 이벤트가 디스패치될 때, 반드시 그 전에 paste [CLIPBOARD-APIS] 이벤트가 있어야 합니다.

9. 개인정보 및 보안 고려사항

이 섹션은 규범적이지 않습니다.

이 기능은 기존 이벤트(예: keydownkeypress [UI-EVENTS] 이벤트)를 통해 이미 이용 가능한 지문 채취 [fingerprinting-guidance] 기법 외에는 알려진 보안 또는 개인정보 영향이 없습니다.

만약 이 기능이 기존 이벤트를 대체한다면, 사용자의 의도가 기록되고, 사용자가 이 의도를 표현하는 데 사용한 특정 하드웨어 유형이 기록되지 않으므로 지문 채취 [fingerprinting-guidance] 기법의 감소로 이어질 수 있습니다.

10. 감사의 글

Michael Aufreiter, Adrian Bateman, Oliver Buchtala, Robin Berjon, Enrica Casucci, Bo Cupp, Domenic Denicola, Emil Eklund, Olivier Forget, Aryeh Gregor, Marijn Haverbeke, Yoshifumi Inoue, Koji Ishii, Gary Kacmarcik, Ian Kilpatrick, Frederico Caldeira Knabben, Takayoshi Kochi, Piotrek Koszuliński, Travis Leithead, Grisha Lyukshin, Miles Maxfield, Chaals McCathie Nevile, Masayuki Nakano, Ryosuke Niwa, Julie Parent, Ben Peters, Florian Rivoal, Morgan Smith, Hallvord R. M. Steen, Johan Sörlin, Cristian Talau, Dave Tapuska, Ojan Vafai, Léonie Watson, Xiaoqian Wu, Chong Zhang, Joanmarie, 그리고 Editing Taskforce의 모든 분들께 의견과 피드백에 감사드립니다.

A. 참고 문헌

A.1 규범적 문헌

[CLIPBOARD-APIS]
Clipboard API 및 이벤트. Gary Kacmarcik; Anupam Snigdha. W3C. 2025년 5월 16일. W3C 작업 초안. URL: https://www.w3.org/TR/clipboard-apis/
[CSSOM]
CSS 오브젝트 모델(CSSOM). Daniel Glazman; Emilio Cobos Álvarez. W3C. 2021년 8월 26일. W3C 작업 초안. URL: https://www.w3.org/TR/cssom-1/
[DOM]
DOM 현행 표준. Anne van Kesteren. WHATWG. 현행 표준. URL: https://dom.spec.whatwg.org/
[FileAPI]
File API. Marijn Kruisselbrink. W3C. 2024년 12월 4일. W3C 작업 초안. URL: https://www.w3.org/TR/FileAPI/
[fingerprinting-guidance]
웹 명세에서 브라우저 지문 채취 완화. Nick Doty; Tom Ritter. W3C. 2025년 8월 4일. W3C 작업 그룹 노트. URL: https://www.w3.org/TR/fingerprinting-guidance/
[HTML]
HTML 현행 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[infra]
Infra 현행 표준. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[mimesniff]
MIME Sniffing 현행 표준. Gordon P. Hemsley. WHATWG. 현행 표준. URL: https://mimesniff.spec.whatwg.org/
[RFC2119]
RFC에서 요구 수준을 나타내는 주요 단어. S. Bradner. IETF. 1997년 3월. 현행 최선 관행. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC8174]
RFC 2119 주요 단어에서 대문자와 소문자의 모호성. B. Leiba. IETF. 2017년 5월. 현행 최선 관행. URL: https://www.rfc-editor.org/rfc/rfc8174
[UI-EVENTS]
UI 이벤트. Gary Kacmarcik; Travis Leithead. W3C. 2024년 9월 7일. W3C 작업 초안. URL: https://www.w3.org/TR/uievents/
[WEBIDL]
Web IDL 현행 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

A.2 참고용 문헌

[i18n-glossary]
국제화 용어집. Richard Ishida; Addison Phillips. W3C. 2024년 10월 17일. W3C 작업 그룹 노트. URL: https://www.w3.org/TR/i18n-glossary/
[INPUT-EVENTS]
입력 이벤트 레벨 1. Johannes Wilm. W3C. 2023년 9월 28일. W3C 작업 초안. URL: https://www.w3.org/TR/input-events-1/