WAI-ARIA (Web Accessibility Initiative - Accessible Rich Internet Applications) 는 웹 콘텐츠와 애플리케이션이 장애인에게 더 접근 가능하도록 돕는 W3C의 표준으로, 보조 기술이 웹 페이지를 이해하고 상호작용할 수 있도록 역할, 상태, 속성을 정의합니다. ARIA의 첫 번째 규칙은 네이티브 HTML 요소가 이미 적절한 의미와 동작을 제공하는 경우, 이를 변경하지 않고 그대로 사용하는 것이 중요하다는 것입니다. 즉, 네이티브 HTML의 접근성 기능을 우선 활용해야 합니다.
동적인 콘텐츠와 고급 사용자 인터페이스 컨트롤을 대상으로 하는 웹 접근성 표준으로, 특히 스크린 리더 사용자와 같은 보조 기술 사용자가 웹 애플리케이션을 효과적으로 사용할 수 있도록 돕기 위해 설계됨.
HTML에 추가적인 속성을 제공하여 접근성을 높이며, 이 속성들은 웹 요소의 역할, 상태, 속성을 설명하여 보조 기술이 이를 더 잘 이해하고 사용자에게 전달할 수 있도록 한다. 이를 통해 복잡한 웹 애플리케이션에서도 모든 사용자가 원활하게 상호작용할 수 있는 환경을 제공.
WAI-ARIA의 개념은 2004년 W3C에서 처음 논의되었으며, 당시 웹 애플리케이션이 점점 더 복잡해지면서 접근성을 보장하는 새로운 방법이 필요하다는 인식이 있었음.
2006년: 첫 번째 공개 작업 초안 (Working Draft)
WAI-ARIA의 첫 번째 공개 작업 초안 발표. 이 초안은 복잡한 웹 애플리케이션에서 동적 콘텐츠와 고급 위젯을 정의하는 방법을 설명.
이 초기 버전은 기본적인 롤(roles), 속성(properties), 상태(states) 등을 정의.
2009년: WAI-ARIA 1.0 발표
WAI-ARIA 1.0의 첫 번째 권고 초안이 W3C에서 발표. 이 버전은 웹 접근성 향상을 위한 표준을 제시.
새로운 롤(Role), 속성(Properties), 상태(States) 정의.
사용자 인터페이스 구성 요소(UI Components)의 접근성을 정의하는 방법 제시.
2014년: WAI-ARIA 1.0 권고안 (Recommendation)
WAI-ARIA 1.0이 W3C의 권고안으로 공식 발표. 이 버전은 웹 접근성 커뮤니티에서 널리 채택되었으며, 다양한 브라우저와 보조 기술에서 지원하기 시작.
2017년: WAI-ARIA 1.1 발표
WAI-ARIA 1.1 버전 발표. 이 버전은 WAI-ARIA 1.0의 개선 및 확장을 포함하며, 사용자 경험을 개선하는 새로운 롤과 속성들이 추가.
기존 롤(Role)과 속성(Property)에 대한 추가 명세 개선.
새로운 롤(Role) 및 속성(Property) 도입.
스크린 리더와 같은 보조 기술과의 호환성 향상.
2021년: WAI-ARIA 1.2 발표
WAI-ARIA 1.2 권고안으로 발표. 이 버전은 이전 버전들의 피드백을 반영하여 더욱 정교한 접근성 요구 사항을 추가.
복합 위젯에 대한 추가 정의.
사용자 정의 위젯에 대한 접근성 지원.
라이브 영역(live regions)에 대한 개선된 지침 제공.
현재 ~ : WAI-ARIA 1.3
WAI-ARIA의 다음 버전인 1.3에 대한 논의가 진행 중이며, 웹 접근성 표준의 계속적인 개선이 목표. WAI-ARIA 1.3은 더 많은 사용자 정의 위젯 지원과 접근성 테스트 및 지원의 자동화를 목표로 할 가능성.
3. WAI-ARIA의 중요성
웹 접근성 표준화
WAI-ARIA는 동적 콘텐츠와 복잡한 사용자 인터페이스를 포함하는 웹 애플리케이션의 접근성을 보장하기 위해 필수적인 기술 표준.
보조 기술과의 통합
WAI-ARIA는 스크린 리더, 화면 확대 소프트웨어 등 보조 기술이 웹 콘텐츠를 보다 정확하게 해석하고 사용자에게 전달할 수 있도록 돕는다.
포용적인 웹 환경 조성
모든 사용자가 웹 애플리케이션을 사용할 수 있도록 보장하여 포용적인 웹 환경을 조성.
WAI-ARIA를 웹 사이트와 애플리케이션에 적절히 적용하면, 장애를 가진 사용자를 포함한 모든 사용자가 웹 콘텐츠를 보다 쉽게 접근하고 사용할 수 있게 된다.
4. WAI-ARIA 적용 시 주의사항
WAI-ARIA의 남용 방지
이미 접근성이 내장된 네이티브 HTML 요소에 불필요하게 WAI-ARIA를 추가하지 않도록 주의
예) <button> 요소는 이미 접근성이 확보되어 있으므로 추가적인 role=”button” 속성 불필요.
테스트 필수
다양한 보조 기술(스크린 리더, 키보드 내비게이션 등)과 다양한 브라우저에서 충분히 테스트하여, WAI-ARIA 적용이 의도한 대로 작동하는지 확인.
웹 표준 준수
WAI-ARIA를 적용할 때 웹 표준을 준수하고, 가이드라인에 따라 역할, 속성, 상태를 올바르게 사용.
5. WAI-ARIA의 주요 역할(Role)
WAI-ARIA에서 역할(Role) 은 특정 HTML 요소가 웹 페이지 내에서 어떤 역할을 하는지를 정의하며, 스크린 리더와 같은 보조 기술이 이 정보를 이용해 사용자가 웹 콘텐츠를 더 잘 이해하고 탐색할 수 있도록 돕는다.
대부분의 시멘틱 마크업의 요소들은 기본적인 역할(Role) 이 지원되고 있으며,
기존 레거시 시스템이나 특정 요구 사항으로 인해 div 요소를 사용해야 하는 상황에서 동일한 접근성 역할을 부여하여 사용 가능하다. Accessible Rich Internet Applications (WAI-ARIA) 1.2 - Roles Model MDN WAI-ARIA 역할
5.1. ARIA 역할 유형
ARIA 역할 유형은 웹 페이지와 애플리케이션에서 다양한 요소의 기능과 구조를 정의하여, 보조 기술이 이를 올바르게 인식하고 사용자에게 전달할 수 있도록 돕는다.
각 역할 유형은 특정 UI 구성 요소나 문서 구조를 설명하며, 이들 역할을 올바르게 사용하면 웹 접근성을 크게 향상시킬 수 있다. 작업시 이러한 역할을 잘 이해하고 적절히 활용하여 모든 사용자가 웹 콘텐츠에 효과적으로 접근할 수 있도록 해야 한다.
Abstract Roles (추상적 역할)
문서를 구성하고 간소화하는 데 도움이 되도록 브라우저에서만 사용하기 위한 것. HTML 마크업을 작성하는 개발자가 사용해서는 안 됨. 참조용으로만 포함.
주요 예시)command, composite, input, landmark, range, roletype, section, sectionhead, select, structure, widget 및 window.
Widget Roles (위젯 역할)
사용자의 상호작용을 처리하는 UI 요소들을 정의하는 역할이며, 버튼, 슬라이더, 탭 등과 같은 상호작용 가능한 위젯을 나타내며, 사용자가 직접 조작할 수 있는 요소들. Widget Roles는 보조 기술이 이러한 요소의 기능과 상태를 이해하고 사용자에게 올바르게 전달하도록 돕는다.
// 예시
<div role="tabpanel" aria-labelledby="tab1">Content for Tab 1</div>
8. Role: header
header 요소의 역할을 수행하는 div요소에 role=”banner” 속성을 추가
// 기본 시멘틱 마크업 예시
<header>
<h1>Website Title</h1>
<nav>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
</ul>
</nav>
</header>
// role 부여 예시 - header 역할을 하는 div
<div role="banner">
<h1>Website Title</h1>
<nav>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
</ul>
</nav>
</div>
9. Role: main
main 요소의 역할을 수행하는 div요소에 role=”main” 속성을 추가
// 기본 시멘틱 마크업 예시
<header>
<h1>Website Title</h1>
<nav>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
</ul>
</nav>
</header>
// role 부여 예시 - main 역할을 하는 div
<div role="banner">
<h1>Website Title</h1>
<nav>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
</ul>
</nav>
</div>
10. Role: section
section 요소의 역할을 수행하는 div요소에 role=”region” 속성을 추가. 이때, aria-labelledby를 사용하여 섹션 제목을 참조할 수 있다.
// 기본 시멘틱 마크업 예시
<section>
<h2 id="section-title">Section Title</h2>
<p>This is a section of the document.</p>
</section>
// role 부여 예시 - section 역할을 하는 div
<div role="region" aria-labelledby="section-title">
<h2 id="section-title">Section Title</h2>
<p>This is a section of the document.</p>
</div>
11. Role: article
article 요소의 역할을 수행하는 div요소에 role=”article” 속성을 추가.
// 기본 시멘틱 마크업 예시
<article>
<h2>Article Title</h2>
<p>This is an article content that stands alone and could be distributed separately from the rest of the document.</p>
</article>
// role 부여 예시 - article 역할을 하는 div
<div role="article">
<h2>Article Title</h2>
<p>This is an article content that stands alone and could be distributed separately from the rest of the document.</p>
</div>
12. Role: footer
footer 요소의 역할을 수행하는 div요소에 role=”contentinfo” 속성을 추가.
aside 요소의 역할을 수행하는 div요소에 role=”complementary” 속성을 추가.
// 기본 시멘틱 마크업 예시
<aside>
<h3>Related Links</h3>
<ul>
<li><a href="#link1">Link 1</a></li>
<li><a href="#link2">Link 2</a></li>
</ul>
</aside>
// role 부여 예시 - aside 역할을 하는 div
<div role="complementary">
<h3>Related Links</h3>
<ul>
<li><a href="#link1">Link 1</a></li>
<li><a href="#link2">Link 2</a></li>
</ul>
</div>
5.3. 역할(Role) 요약 및 주의사항
역할 부여
div 요소에 role 속성을 추가하여, 특정 HTML5 요소가 제공하는 접근성 역할을 구현할 수 있다.
일관된 접근성
보조 기술은 이러한 role 속성을 사용하여 요소를 올바르게 해석하고, 사용자가 페이지의 구조와 내용에 대해 명확하게 이해할 수 있도록 돕는다.
네이티브 요소 사용 권장
가능한 경우에는 role 속성을 사용하는 대신, HTML5에서 제공하는 네이티브 요소(header, main, section, article, footer, aside 등)를 사용하는 것이 좋다.
네이티브 요소는 이미 접근성을 고려하여 설계되었기 때문에, 별도의 role 속성 없이도 보조 기술에 의해 올바르게 해석된다.
// 잘못된 예시 - 이미 접근성을 지원하는 네이티브 HTML 요소에 불필요하게 WAI-ARIA 속성을 사용하는 것
<button role="button" aria-pressed="false">Submit</button>
// 올바른 예시1 - HTML5에서는 일부 요소가 이미 접근성을 기본적으로 지원
<button type="button">Submit</button>
// 올바른 예시2 - 네이티브 HTML 요소를 사용할 수 없거나, 사용자 정의 요소를 사용하여 접근성을 구현해야 하는 상황에서 올바르게 WAI-ARIA를 사용하는 방법
<div role="button"tabindex="0" aria-pressed="false">Submit</div>