웹 접근성(Web Accessibility)은
장애가 있는 사용자도 웹 콘텐츠를 문제없이 접근하고 사용할 수 있도록 만드는 기술과 설계다.
예전에는 “나랑 상관없지”라고 생각했지만,
지금은 공공기관, 대기업, 심지어 스타트업까지
접근성을 지키지 않으면 리스크가 생기는 시대다.
이번 글에서는 프론트엔드 개발자가 실무에서 웹 접근성을 고려할 수 있는 실질적인 방법들을 정리해봤다.
alt
속성<img src="product.jpg" alt="삼성 갤럭시 S23 핸드폰 전면 이미지" />
alt=""
로 비워두기button
태그로<button onClick={doSomething}>저장하기</button>
❌ <div onClick>
은 스크린 리더에서 "무응답 요소"로 인식될 수 있음
✅ role="button"
+ tabIndex=0
으로도 대응 가능하지만, button
태그가 가장 안전
label
과 연결<label for="email">이메일 주소</label>
<input id="email" name="email" />
label
없이 placeholder만 있는 입력은 매우 불친절tabIndex="-1"
로는 포커스 이동 불가tabIndex="0"
이상이 되어야 Tab으로 접근 가능속성 | 역할 |
---|---|
aria-label | 시각적으로 보이지 않지만, 스크린 리더에게 설명 제공 |
aria-hidden="true" | 해당 요소를 스크린 리더에서 무시하게 함 |
aria-live="polite" | 동적 변화 영역을 사용자에게 자동 읽어주기 |
role="dialog" | 모달 컴포넌트에 사용 (스크린 리더에 알림) |
<div role="dialog" aria-modal="true" aria-labelledby="modalTitle">
<h2 id="modalTitle">회원가입 완료</h2>
<p>이제 로그인이 가능합니다.</p>
<button onClick={closeModal}>닫기</button>
</div>
role="dialog"
→ 모달임을 알림 aria-labelledby
→ 타이틀을 읽음 aria-modal="true"
→ 모달이 떠 있을 때 백그라운드는 접근 불가처음엔 alt
, label
정도만 챙기면 된다고 생각했는데,
접근성 검사 도구로 페이지를 돌려보면 정말 많은 부분이 지적된다.
접근성은 “눈에 안 보이는 UX”라는 말처럼,
디자인보다도 개발자가 더 책임지고 챙겨야 하는 부분이라는 걸 깨달았다.
이제는 마크업 짤 때 기본적으로 role
, aria
, tabIndex
를 습관적으로 넣고 있다.
🫶 "접근성은 일부 사용자를 위한 기능이 아니라, 모두를 위한 기본값이다."