Learning
레슨 11 / 13·5개 토픽

접근성과 시맨틱 마크업

웹 접근성이란?

웹 접근성(Web Accessibility, a11y)은 장애 여부와 관계없이 모든 사용자가 웹 콘텐츠에 접근하고 사용할 수 있도록 보장하는 것입니다. 시각, 청각, 운동, 인지 장애를 가진 사용자뿐 아니라 고령자, 느린 네트워크 환경의 사용자까지 포함합니다. 접근성 좋은 사이트는 SEO에도 유리합니다.

ARIA 역할과 속성

ARIA(Accessible Rich Internet Applications)는 HTML 요소에 접근성 정보를 추가하는 속성들입니다. 스크린 리더와 보조 기술이 콘텐츠를 올바르게 해석할 수 있도록 도와줍니다. 하지만 네이티브 HTML 시맨틱 태그로 충분하다면 ARIA를 추가할 필요가 없다는 원칙("No ARIA is better than bad ARIA")을 기억하세요.

html
<!-- ── aria-label: 시각적 텍스트가 없는 요소에 라벨 제공 ── -->
<button aria-label="메뉴 닫기">
  <svg><!-- X 아이콘 --></svg>
</button>

<!-- ── aria-describedby: 요소에 대한 추가 설명 연결 ── -->
<input type="password" aria-describedby="pw-help" />
<p id="pw-help">비밀번호는 8자 이상이어야 합니다.</p>

<!-- ── aria-expanded: 펼침/접힘 상태 표시 ── -->
<button aria-expanded="false" aria-controls="menu">
  카테고리
</button>
<ul id="menu" hidden>
  <li>웹 개발</li>
  <li>프로그래밍</li>
</ul>

<!-- ── role: 요소의 역할을 명시 ── -->
<div role="alert">저장에 실패했습니다. 다시 시도해 주세요.</div>
<div role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100">
  60% 완료
</div>

<!-- ── aria-live: 동적 콘텐츠 변경 알림 ── -->
<div aria-live="polite">검색 결과: 42건</div>

키보드 내비게이션과 포커스 관리

마우스를 사용하지 못하는 사용자는 키보드(Tab, Shift+Tab, Enter, Escape)로 웹 페이지를 탐색합니다. 모든 인터랙티브 요소가 키보드로 접근 가능해야 하며, 포커스 순서가 논리적이어야 합니다. tabindex 속성으로 포커스 동작을 제어할 수 있습니다.

html
<!-- tabindex="0": 자연스러운 탭 순서에 포함 -->
<div tabindex="0" role="button" onclick="handleClick()">
  커스텀 버튼
</div>

<!-- tabindex="-1": 탭으로 접근 불가, JS로 포커스 가능 -->
<div id="modal" tabindex="-1">
  <!-- 모달이 열리면 JS로 포커스 이동 -->
</div>

<!-- ⚠️ tabindex="1" 이상: 사용하지 마세요! 자연 순서를 깨뜨립니다 -->
css
/* 포커스 스타일을 절대 제거하지 마세요 */
/* ❌ 나쁜 예 */
*:focus { outline: none; }

/* ✅ 좋은 예: 커스텀 포커스 스타일 제공 */
:focus-visible {
  outline: 2px solid #10b981;
  outline-offset: 2px;
}

/* 마우스 클릭 시에는 포커스 링 숨기기 */
:focus:not(:focus-visible) {
  outline: none;
}

/* 스킵 내비게이션 — 키보드 사용자가 바로 본문으로 이동 */
.skip-link {
  position: absolute;
  top: -100%;
  left: 0;
  z-index: 9999;
}

.skip-link:focus {
  top: 0;
  background: #10b981;
  color: #fff;
  padding: 8px 16px;
}

색상 대비와 스크린 리더

WCAG 2.1 기준으로 일반 텍스트는 최소 4.5:1, 큰 텍스트(18pt 이상)는 3:1의 색상 대비 비율을 충족해야 합니다. 색상만으로 정보를 전달하지 말고, 아이콘이나 텍스트를 함께 사용하세요. 스크린 리더 사용자를 위해 이미지에는 항상 alt 속성을, 장식용 이미지에는 빈 alt=""를 사용합니다.

html
<!-- ✅ 의미 있는 이미지: 설명 제공 -->
<img src="chart.png" alt="2024년 매출 추이: 1분기 120억에서 4분기 180억으로 증가" />

<!-- ✅ 장식 이미지: 빈 alt -->
<img src="decorative-line.svg" alt="" />

<!-- ✅ 색상 외 추가 단서 제공 -->
<span class="status-error">
  <svg><!-- ⚠️ 아이콘 --></svg>
  오류: 이메일 형식이 올바르지 않습니다
</span>

<!-- ❌ 색상만으로 정보 전달 (접근성 위반) -->
<span style="color: red;">오류 발생</span>

시맨틱 HTML 요소 복습

시맨틱 태그는 콘텐츠의 의미를 나타내는 HTML 태그입니다.

대신 적절한 시맨틱 태그를 사용하면 스크린 리더가 페이지 구조를 파악할 수 있고, SEO에도 유리합니다.

html
<!-- ── 올바른 시맨틱 구조 ── -->
<body>
  <header>
    <nav aria-label="메인 내비게이션">
      <a href="/">홈</a>
      <a href="/about">소개</a>
    </nav>
  </header>

  <main>
    <article>
      <h1>블로그 제목</h1>
      <time datetime="2024-12-01">2024년 12월 1일</time>
      <p>본문 내용...</p>

      <aside>
        <h2>관련 글</h2>
        <ul>
          <li><a href="/post-2">다음 글</a></li>
        </ul>
      </aside>
    </article>
  </main>

  <footer>
    <p>&copy; 2024 JackerLab</p>
    <nav aria-label="푸터 내비게이션">
      <a href="/privacy">개인정보처리방침</a>
      <a href="/terms">이용약관</a>
    </nav>
  </footer>
</body>
  • - 페이지 또는 섹션의 머리글 (로고, 네비게이션)
  • - 페이지의 주요 콘텐츠 (페이지당 1개)
  • - 독립적인 콘텐츠 단위 (블로그 글, 뉴스 기사)
  • - 주제별 콘텐츠 그룹 (보통 제목 태그 포함)
  • - 바닥글 (저작권, 연락처)
  • /
    - 이미지/도표와 그 설명
💡

접근성은 나중에 추가하는 것이 아니라 처음부터 고려해야 합니다. Chrome DevTools의 Lighthouse 감사에서 "Accessibility" 점수를 확인하고, axe DevTools 확장을 설치하면 접근성 문제를 쉽게 발견할 수 있습니다.