기본 개념
ARIA란 무엇인가
WAI-ARIA는 HTML만으로 표현하기 어려운 UI의 역할·상태·속성을 보조기술에 전달하는 W3C 명세입니다. ARIA가 하는 일과 하지 않는 일, 버전 변화와 관련 명세를 정리합니다.
ARIA의 정의
WAI-ARIA(Web Accessibility Initiative – Accessible Rich Internet Applications, 줄여서 ARIA)는 W3C가 만든 명세로, 웹 페이지의 요소가 무엇인지(역할), 지금 어떤 상황인지(상태), 어떤 성질을 가졌는지(속성)를 보조기술(화면낭독기, 점자정보단말기, 음성 인식 프로그램 등)에 알려 주는 HTML 속성 모음입니다.
ARIA는 크게 두 가지로 이루어집니다.
- 역할(role) —
role="tablist",role="dialog"처럼 요소의 종류를 정합니다. 요소마다 하나만 지정하며, 보통 바뀌지 않습니다. - 상태와 속성(states and properties) —
aria-로 시작하는 속성입니다.aria-expanded처럼 사용자 조작에 따라 자주 바뀌는 값은 상태,aria-labelledby처럼 거의 고정된 값은 속성이라고 부릅니다.
<button type="button" aria-expanded="false" aria-controls="faq-1">
배송은 얼마나 걸리나요?
</button>
<div id="faq-1" hidden>주문 후 2~3일 안에 도착합니다.</div>위 코드에서 버튼의 역할(버튼)과 이름(“배송은 얼마나 걸리나요?”)은 HTML이 이미 알려 줍니다. ARIA는 HTML에 없는 정보, 즉 “이 버튼이 제어하는 영역이 지금 접혀 있다”는 사실만 보탭니다. 자세한 구분은 역할·상태·속성 문서를 참고하세요.
왜 필요한가요
HTML에는 <button>, <input type="checkbox">, <nav>처럼 의미가 정해진 요소가 많습니다. 이런 요소는 브라우저가 알아서 보조기술에 “버튼”, “체크박스”, “탐색 랜드마크”라고 알려 줍니다.
그러나 현대 웹 애플리케이션에는 HTML에 대응 요소가 없는 UI가 많습니다.
- 탭(
tablist,tab,tabpanel) — HTML에는 탭 요소가 없습니다. - 트리 메뉴(
tree), 콤보박스 자동완성(combobox), 그리드(grid) - 동적으로 바뀌는 상태 — “펼쳐짐”(
aria-expanded), “선택됨”(aria-selected), “현재 페이지”(aria-current) - 화면 갱신 알림 — 장바구니 담기 완료, 검색 결과 건수처럼 포커스와 상관없이 알려야 하는 메시지(
aria-live,status)
이런 정보를 보조기술에 전달할 방법이 없으면, 눈으로 보는 사용자는 알 수 있는 내용을 화면낭독기 사용자는 알 수 없습니다. ARIA는 이 빈틈을 메우기 위해 만들어졌습니다.
<div class="tab is-active">공지</div>
<div class="tab">자료실</div><div role="tablist" aria-label="게시판">
<button role="tab" aria-selected="true" aria-controls="p1" id="t1">공지</button>
<button role="tab" aria-selected="false" aria-controls="p2" id="t2" tabindex="-1">자료실</button>
</div>ARIA가 하는 일
ARIA는 브라우저가 만드는 접근성 트리의 정보를 추가하거나 바꿉니다. 구체적으로는 다음과 같은 일을 합니다.
| 하는 일 | 예 |
|---|---|
| 역할 부여 | role="dialog" — 이 영역은 대화상자입니다. |
| 이름·설명 지정 | aria-label, aria-labelledby, aria-describedby |
| 상태 전달 | aria-expanded, aria-checked, aria-pressed, aria-invalid |
| 관계 표현 | aria-controls, aria-owns, aria-activedescendant |
| 변화 알림 | aria-live, alert, status |
| 보조기술에서 숨기기 | aria-hidden — 장식용 아이콘을 읽지 않게 합니다. |
| 의미 제거 | role="presentation" / role="none" — 레이아웃용 표의 표 의미를 없앱니다. |
ARIA가 하지 않는 일
ARIA를 처음 배울 때 가장 많이 오해하는 부분입니다. ARIA 속성은 접근성 트리에만 영향을 줄 뿐, 화면의 모양이나 요소의 동작은 전혀 바꾸지 않습니다.
- 모양을 바꾸지 않습니다.
aria-hidden="true"를 붙여도 화면에서는 그대로 보입니다.aria-expanded="true"로 바꿔도 패널은 저절로 열리지 않습니다. - 동작을 만들지 않습니다.
role="button"을 붙인<div>는 Tab 키로 포커스가 가지 않고, Enter·Space 키로 눌리지도 않습니다. 키보드 처리는 개발자가 직접 넣어야 합니다. - 포커스를 관리하지 않습니다.
role="dialog"나aria-modal="true"를 붙여도 포커스는 대화상자로 이동하지 않습니다. 포커스 이동과 복귀는 스크립트로 처리합니다. - 상태를 스스로 갱신하지 않습니다. 사용자가 체크박스를 눌렀다면
aria-checked값도 스크립트로 바꿔야 합니다.
<div role="button" class="btn">저장</div><button type="button" class="btn">저장</button>ARIA는 약속입니다
역할을 지정하는 것은 “이 요소는 버튼처럼 동작합니다”라고 보조기술 사용자에게 약속하는 것과 같습니다. 약속한 동작(포커스, 키보드, 상태 변화)을 구현하지 않으면 사용자는 버튼이라고 들었는데 누를 수 없는 상황을 겪습니다. 그래서 ARIA 사용 규칙의 첫 번째 원칙은 “가능하면 HTML 요소를 쓰라”입니다.
역사와 버전
ARIA는 2000년대 중반 Ajax 기반 웹 애플리케이션이 늘어나면서, 스크립트로 만든 위젯을 보조기술이 이해하지 못하는 문제를 풀기 위해 시작되었습니다.
| 버전 | 상태 | 주요 내용 |
|---|---|---|
| WAI-ARIA 1.0 | W3C 권고안 (2014년 3월) | 역할·상태·속성의 기본 체계와 라이브 리전을 정의했습니다. |
| WAI-ARIA 1.1 | W3C 권고안 (2017년 12월) | feed, figure, table, cell, term 등 역할과 aria-current, aria-details, aria-errormessage, aria-keyshortcuts, aria-modal, aria-placeholder, aria-roledescription 등을 추가했습니다. aria-grabbed, aria-dropeffect는 사용 중단되었습니다. |
| WAI-ARIA 1.2 | W3C 권고안 (2023년 6월) | generic, paragraph, blockquote, caption, code, emphasis, strong, meter, time 등 HTML 요소에 대응하는 역할을 추가하고, combobox 패턴을 단순하게 바꿨습니다. 이 사이트의 기준 버전입니다. |
| WAI-ARIA 1.3 | 작업 초안 (Working Draft) | aria-description, aria-braillelabel, aria-brailleroledescription, aria-colindextext, aria-rowindextext와 mark, suggestion, comment 역할 등이 논의되고 있습니다. 확정 전이므로 지원 여부를 확인하고 사용합니다. |
권고안과 초안
W3C 명세는 작업 초안(WD) → 후보 권고안(CR) → 권고안(REC) 단계를 거칩니다. 권고안은 확정된 표준이고, 초안은 내용이 바뀔 수 있습니다. 다만 브라우저가 초안 기능을 먼저 구현하는 경우도 많아, 1.3의 일부 속성은 이미 주요 브라우저에서 동작합니다.
관련 명세
ARIA는 단독 명세가 아니라 여러 명세가 함께 동작하는 묶음입니다. 실무에서 자주 참고하는 명세는 다음과 같습니다.
| 명세 | 다루는 내용 |
|---|---|
| WAI-ARIA 1.2 | 역할·상태·속성의 정의와 규칙(필수 속성, 허용 속성, 필수 상위·하위 역할) |
| ARIA Authoring Practices Guide (APG) | 탭, 대화상자, 메뉴 같은 위젯을 만드는 방법과 키보드 동작 권장 사항. 규범이 아닌 안내 문서입니다. |
| Using ARIA | ARIA를 올바르게 쓰기 위한 5가지 규칙과 실무 조언 |
| ARIA in HTML | HTML 요소마다 지정할 수 있는 역할과 aria-* 속성의 허용·금지 규칙(작성자·검사 도구 대상) |
| HTML-AAM | HTML 요소가 각 운영체제의 접근성 API에 어떻게 연결되는지(브라우저 개발자 대상) |
| Core-AAM | ARIA 역할·상태·속성이 접근성 API에 어떻게 연결되는지 |
| AccName | 접근 가능한 이름과 설명을 계산하는 알고리즘. 접근 가능한 이름 문서에서 자세히 다룹니다. |
| DPub-ARIA, Graphics-ARIA | 전자출판(doc-* 역할)과 SVG 그래픽(graphics-* 역할)을 위한 확장 모듈 |
“AAM”은 Accessibility API Mappings의 줄임말입니다. 작성자는 주로 WAI-ARIA, APG, ARIA in HTML을 보고, 브라우저가 특정 요소를 어떻게 노출하는지 궁금할 때 AAM 명세를 확인합니다.
ARIA와 WCAG의 관계
WCAG(웹 콘텐츠 접근성 지침)는 “무엇을 달성해야 하는가”를 정한 기준이고, ARIA는 그 기준을 달성하는 기술 수단 중 하나입니다. 예를 들어 WCAG 4.1.2 이름, 역할, 값은 모든 UI 구성 요소의 이름과 역할을 프로그램이 알 수 있어야 한다고 요구합니다. 네이티브 HTML로 충족할 수 있다면 ARIA는 필요 없고, 직접 만든 위젯이라면 ARIA로 충족합니다.
국내 기준인 KWCAG도 같은 원칙을 따르며, “웹 애플리케이션 접근성 준수” 항목에서 같은 내용을 요구합니다.
다음 단계
ARIA 정보가 실제로 어디에 담기는지 이해하려면 접근성 트리와 접근성 API를, 바로 코드를 써 보고 싶다면 실습실을 이용하세요.