적용 방법
설명 연결하기
이름만으로 부족한 보조 정보를 전달하는 방법입니다. aria-describedby, aria-description, aria-details, title의 차이와 알맞은 사용처를 정리합니다.
이름과 설명의 차이
접근 가능한 이름은 요소가 무엇인지를 짧게 알려 주고, 접근 가능한 설명(accessible description)은 그 요소를 쓰는 데 필요한 추가 정보를 알려 줍니다. 화면낭독기는 보통 이름과 역할, 상태를 먼저 읽고 잠시 뒤에 설명을 읽습니다.
<label for="pw">비밀번호</label>
<input type="password" id="pw" aria-describedby="pw-hint">
<p id="pw-hint">8자 이상, 영문과 숫자를 섞어 주세요.</p>
<!-- 화면낭독기 예시: "비밀번호, 편집 창, 8자 이상, 영문과 숫자를 섞어 주세요." -->이름은 짧게 유지하고 형식 안내·주의 사항·현재 값의 보충 정보는 설명으로 분리하면, 탐색할 때는 간결하게 듣고 필요할 때 자세한 내용을 들을 수 있습니다. 이름은 링크·폼 컨트롤 목록에도 표시되지만 설명은 표시되지 않습니다. 따라서 요소를 구분하는 데 꼭 필요한 정보는 설명이 아니라 이름에 넣습니다.
설명도 계산됩니다
설명 역시 AccName 1.2의 규칙으로 계산됩니다. 우선순위는 aria-describedby → aria-description → 호스트 언어의 설명(HTML에서는 이름으로 쓰이지 않은 title) 순입니다. 이름 계산은 접근 가능한 이름 계산 문서를 참고하세요.
네 가지 수단 한눈에 보기
| 수단 | 값 | 화면 표시 | 전달 방식 | 주된 용도 |
|---|---|---|---|---|
aria-describedby | ID 목록 | 참조한 요소가 보임(숨겨도 동작) | 참조한 요소의 텍스트를 평문으로 이어 읽음 | 입력 형식 안내, 오류 메시지, 짧은 보충 설명 |
aria-description | 문자열 | 보이지 않음 | 문자열을 그대로 읽음 | 화면에 이미 시각적으로 드러난 정보를 보조기술에만 짧게 전달 |
aria-details | ID 목록 | 참조한 요소가 보임 | “상세 정보 있음”을 알리고 사용자가 그 위치로 이동 | 표·차트 해설, 긴 설명, 주석·댓글 |
title | 문자열 | 마우스를 올릴 때만 툴팁 | 이름으로 쓰이지 않으면 설명으로 읽힘 | 보조 수단. 중요한 정보에는 쓰지 않음 |
aria-describedby
aria-describedby는 설명이 되는 요소의 ID를 공백으로 구분해 나열합니다. 가장 널리 지원되고 가장 많이 쓰이는 설명 수단입니다. 참조한 요소는 화면에 보이는 텍스트인 것이 좋습니다. 보이는 사용자와 보조기술 사용자가 같은 정보를 받기 때문입니다.
<label for="birth">생년월일</label>
<input type="text" id="birth" inputmode="numeric"
aria-describedby="birth-fmt birth-err" aria-invalid="true">
<p id="birth-fmt">예: 19900115 (8자리 숫자)</p>
<p id="birth-err" class="error">생년월일은 8자리 숫자로 입력해 주세요.</p>- 순서: ID를 나열한 순서대로 이어 읽습니다. 위 예에서는 형식 안내 → 오류 메시지 순입니다.
- 숨겨진 요소 참조: 참조한 요소가
hidden이나display: none이어도 텍스트가 설명에 들어갑니다. 다만 보이는 사용자에게는 정보가 없으므로, 보이는 텍스트를 참조하는 것을 기본으로 합니다. - 구조는 사라짐: 참조한 요소의 목록·링크·제목 같은 구조는 전달되지 않고 하나의 평문으로 합쳐집니다. 긴 문단이나 링크가 들어 있는 내용은
aria-details가 더 알맞습니다. - 변경 알림 아님: 설명 텍스트를 바꿔도 화면낭독기가 즉시 읽어 주지는 않습니다. 사용자가 다음에 그 요소로 이동할 때 새 설명을 듣습니다. 즉시 알려야 하면 라이브 리전을 함께 씁니다.
<label for="q">검색어를 입력하세요. 상품명, 브랜드, 모델 번호로 검색할 수 있습니다</label>
<input type="search" id="q"><label for="q">검색어</label>
<input type="search" id="q" aria-describedby="q-help">
<p id="q-help">상품명, 브랜드, 모델 번호로 검색할 수 있습니다.</p>aria-description
aria-description는 aria-label의 설명 버전으로, 참조할 요소 없이 문자열로 설명을 직접 지정합니다. 화면에는 보이지 않습니다.
<button aria-description="되돌릴 수 없습니다">계정 삭제</button>명세 상태: WAI-ARIA 1.3 초안
aria-description은 WAI-ARIA 1.2에는 없고 WAI-ARIA 1.3 작업 초안에 정의된 속성입니다. 주요 브라우저(Chromium, Firefox, Safari)와 화면낭독기가 대부분 지원하지만, 오래된 환경에서는 무시될 수 있습니다. 같은 정보를 화면에 보이는 텍스트로도 제공할 수 있다면 aria-describedby가 더 안전합니다.
보이지 않는 설명은 화면을 보는 사용자에게 주지 않는 정보를 보조기술 사용자에게만 주는 셈입니다. “되돌릴 수 없습니다”처럼 중요한 경고라면 모든 사용자가 볼 수 있게 화면에 표시하고 aria-describedby로 연결하는 것이 바람직합니다. aria-description은 색이나 아이콘으로 이미 시각적으로 드러난 정보를 짧게 보완할 때 알맞습니다.
aria-details
aria-details(WAI-ARIA 1.2)는 요소에 대한 자세한 설명이 페이지의 다른 곳에 있다는 것을 알립니다. aria-describedby와 달리 내용을 평문으로 읽지 않고, 화면낭독기가 “상세 정보 있음” 같은 안내를 한 뒤 사용자가 명령으로 그 위치로 이동해 구조(제목·목록·표·링크)를 그대로 탐색할 수 있게 합니다.
<figure>
<img src="sales-2025.png" alt="2025년 분기별 매출 막대그래프"
aria-details="sales-detail">
<figcaption>2025년 분기별 매출</figcaption>
</figure>
<section id="sales-detail">
<h3>그래프 해설</h3>
<table>
<caption>분기별 매출(억 원)</caption>
<tr><th scope="col">1분기</th><th scope="col">2분기</th><th scope="col">3분기</th><th scope="col">4분기</th></tr>
<tr><td>12</td><td>15</td><td>14</td><td>21</td></tr>
</table>
</section>- 짧은 요약은
alt나aria-describedby로, 긴 해설은aria-details로 나눠 함께 쓸 수 있습니다. - 문서 편집기의 주석·댓글처럼 본문과 연결된 별도 콘텐츠를 가리킬 때도 씁니다. 이때 참조 대상에
role="comment"(ARIA 1.3 초안) 같은 역할을 함께 쓰는 경우가 있습니다. - 화면낭독기별 지원 수준이 아직 고르지 않습니다. 상세 내용으로 가는 보이는 링크(“그래프 해설 보기”)를 함께 두면 지원 여부와 관계없이 찾아갈 수 있습니다.
title 속성
HTML의 title 속성은 다른 수단으로 이름이 정해지면 설명으로 쓰이고, 이름 후보가 하나도 없으면 이름으로 쓰입니다. 그러나 여러 한계가 있어 중요한 정보를 담는 수단으로는 적합하지 않습니다.
- 마우스를 올려야만 툴팁이 보이며, 키보드 포커스나 터치로는 보이지 않습니다.
- 툴팁이 뜨는 시간과 위치를 제어할 수 없고 확대 사용자에게는 잘리기 쉽습니다.
- 화면낭독기 설정에 따라 읽히지 않을 수 있습니다.
- 이름과 같은 값을 넣으면 “인쇄, 버튼, 인쇄”처럼 두 번 읽힙니다.
<a href="/notice" title="공지사항">공지사항</a><a href="/notice">공지사항</a>마우스·키보드 모두에서 보이는 보충 설명이 필요하면 툴팁 패턴(tooltip + aria-describedby)이나 화면에 항상 보이는 안내 문구를 씁니다. 예외적으로 <iframe>의 title은 프레임의 이름을 주는 표준 수단이므로 반드시 넣습니다.
어떤 수단을 고를까
| 상황 | 권장 |
|---|---|
| 입력 형식·조건 안내(“8자 이상”) | 보이는 문구 + aria-describedby |
| 폼 오류 메시지 | 보이는 문구 + aria-describedby 또는 aria-errormessage, aria-invalid(폼 접근성 참고) |
| 아이콘·색으로 이미 보이는 상태를 짧게 보충 | aria-description 또는 시각적으로 숨긴 텍스트 + aria-describedby |
| 차트·복잡한 이미지·표의 긴 해설 | aria-details + 보이는 링크 |
| 대화상자 본문 요약 | dialog에 aria-describedby로 본문 첫 문단 연결(문단이 짧을 때만) |
| 마우스 사용자용 툴팁 | tooltip 패턴, title 단독 사용은 피함 |
설명은 짧게
설명은 요소에 포커스할 때마다 읽힙니다. 한두 문장을 넘으면 반복해서 듣기 번거로우므로, 긴 내용은 aria-details나 별도 도움말 링크로 분리하세요.
자주 하는 실수
- 존재하지 않는 ID를 참조해 설명이 비어 있음 — ID 오타나 동적으로 바뀐 ID를 확인하세요.
- 대화상자 전체 본문을
aria-describedby로 연결해 열 때마다 긴 글이 한꺼번에 읽힘. - 이름과 같은 내용을 설명에 반복함.
관련 레퍼런스: aria-describedby · aria-description · aria-details · aria-errormessage · WCAG 3.3.2 레이블 또는 지시사항 · WCAG 1.3.1 정보와 관계