A11y Check ยท ์๋ฆฌ์ฒต
WCAG 2.2 + KWCAG 2.2๋ฅผ ์ด์ค ๋งคํํ ํ๊ตญ์ด ์ฐ์ ์น ์ ๊ทผ์ฑ ์๋ ์ ๊ฒ ์์ง
URL ํ๋๋ก ๋ํ ํ์ด์ง๋ฅผ ์์งํด ์ ๊ทผ์ฑ์ ์ ๊ฒํ๊ณ , ํ๊ตญ์ด ๊ฐ์ ๊ฐ์ด๋ ์
AI ์ฝ๋ฉ ๋๊ตฌ์ฉ ์์ ์์ฒญ ๋ฌธ์๊น์ง ์์ฑํ๋ ์คํ์์ค ์๋น์ค์
๋๋ค.
KWCAG 2.2
๐ ๋ผ์ด๋ธ ๋ฐ๋ชจ a11ychk.com ยท
ํฌ๋กฌ ํ์ฅ ์ค์น ยท
์ ๊ฒ ์ฌ์ดํธ ๋ชฉ๋ก ยท
ํ์ฉ ์งํ ยท
English README
Open-source web accessibility auditing that dual-maps every finding to WCAG 2.2
and KWCAG 2.2 (Korea's national accessibility guidelines), with Korean-language
remediation guides for all 33 KWCAG 2.2 checkpoints.
์ A11y Check์ธ๊ฐ
๋๋ถ๋ถ์ ์๋ ๊ฒ์ฌ ๋๊ตฌ๋ ์๋ฐ ๋ชฉ๋ก์ ์์ด๋ก ๋์ดํ๋ ๋ฐ ๊ทธ์นฉ๋๋ค. A11y Check๋ ์ง๋จ์์
๋ฉ์ถ์ง ์๊ณ ๊ฐ์ ์์
์ผ๋ก ์ด์ด์ง๋ ์ฐ์ถ๋ฌผ ์ ๋ง๋ญ๋๋ค.
๐ฐ๐ท KWCAG 2.2 ํ๊ตญ์ด ๊ท์น ์นดํ๋ก๊ทธ โ packages/core/src/catalog ์
113๊ฐ ๊ท์น (axe-core 98 + ์์ฒด 15, ์ต์ ์์น๋ ์ปค๋ฒ๋ฆฌ์ง ๋ฌธ์ )์ WCAG 2.2 ์ฑ๊ณต๊ธฐ์ค๊ณผ KWCAG 2.2 ๊ฒ์ฌํญ๋ชฉ(33๊ฐ)์ ์ด์ค ๋งคํ ํ๊ณ , ๊ท์น๋ง๋ค ํ๊ตญ์ด
๊ฐ์ ๊ฐ์ด๋๋ฅผ ๋ด์์ต๋๋ค. ์ด ์นดํ๋ก๊ทธ ์์ฒด๊ฐ ์ ๊ทผ์ฑ ์ค๋ฌด์ยท๊ฐ๋ฐ์์๊ฒ ๋
๋ฆฝ์ ์ผ๋ก ์ ์ฉํ ์์ฐ์
๋๋ค.
๐ง ์ง๋จ โ ์์ ์ฐ๊ฒฐ โ ์๋ฐ๋ง๋ค ํ๊ตญ์ด ๊ฐ์ ๋ฐฉ๋ฒ + AI ์ฝ๋ฉ ๋๊ตฌ(CursorยทCopilot ๋ฑ)์ ๊ทธ๋๋ก ํฌ์
๊ฐ๋ฅํ **์์ ์์ฒญ ๋ฌธ์(MarkdownยทJSON)**๋ฅผ ์๋ ์์ฑํฉ๋๋ค.
๐งญ WCAG-EM 2.0 ๋ฐฉ๋ฒ๋ก ์ค์ โ ๋ํ ํ์ด์ง ํ๋ณธ ์ ์ โ ์๋ ์ ๊ฒ โ ์ ๊ฒ์ ํ์ โ ํตํฉ ์ค์์จ๊น์ง
๊ตฌ์กฐํ๋ ํ๊ฐ ์ ์ฐจ๋ฅผ ๋ฐ๋ฅด๊ณ , EARL ๋ฆฌํฌํธ๋ก ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
๐
์ ์งํ ์๋ํ โ ์๋ ๊ฒ์ฌ๊ฐ ํ์ ํ ์ ์๋ ํญ๋ชฉ์ ๊ฐ์ถ์ง ์๊ณ ์๋ ๊ฒ์ฌ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป ์๋ด ํฉ๋๋ค.
"100% ์๋ ํต๊ณผ"๋ฅผ ์ฃผ์ฅํ์ง ์์ต๋๋ค.
๐งฉ ํฌ๋กฌ ํ์ฅ โ ์ฌ์ด๋ ํจ๋์์ ํ์ฌ ํ์ด์ง๋ฅผ ์ค์๊ฐ ์ ๊ฒํ๊ณ , ์๋ฐ์ ํ์ด์ง ์์ ์ง์ ํ์ํฉ๋๋ค.
์๋ ๊ฒ์ฌ ๋๊ตฌ๋ ์ ๊ทผ์ฑ ๋ฌธ์ ์ ์ผ๋ถ๋ง ์ฐพ์ ์ ์์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ ๊ทธ ํ๊ณ๋ฅผ ๋ช
์ํ๊ณ ,
์ฌ๋์ด ํ์ธํด์ผ ํ๋ ํญ๋ชฉ์ ๊ฒ์ฌ ๋ฐฉ๋ฒ๊ณผ ํจ๊ป ์ ๊ณตํ๋ ๊ฒ์ ์์น์ผ๋ก ํฉ๋๋ค.
๋ฌด์์ ํ๋
๊ธฐ๋ฅ ์ ๊ฒ axe-core + ์์ฒด ๊ท์น(๋ฆฌํ๋ก์ฐยท์ด์ ํ์ยทํค๋ณด๋ยท๋์ฒด ํ
์คํธ ํ์งยท๋ฏธ๋์ดยท๋งํฌ์
์ ํจ์ฑ ๋ฑ) + ์ฌ์ดํธ ์์ค ๊ฒ์ฌ(์ ๋ชฉ ์ ์ผ์ฑยท์ผ๊ด๋ ๋ด๋นยท์ฌ๋ฌ ๋ฐฉ๋ฒ) ๋งคํ ๋ชจ๋ ์๋ฐ์ WCAG 2.2 ์ฑ๊ณต๊ธฐ์ค ยท KWCAG 2.2 ๊ฒ์ฌํญ๋ชฉ์ ๋์ ๋์ ๋ณด๊ณ ์ ์๋/์๋/ํตํฉ ์ค์์จ, KWCAG 33ํญ๋ชฉ ๋งคํธ๋ฆญ์ค, ์ธ์ฆ ์ค๋น ์์ฝ, ์ ํ ๋น๊ต, PDFยทCSVยทEARL ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ ๊ท์น๋ณ ํ๊ตญ์ด ๊ฐ์ด๋ + AI ์์ ์์ฒญ ๋ฌธ์(MD/JSON) ํ์ฅ ํฌ๋กฌ MV3 ์ฌ์ด๋ ํจ๋ โ ์ค์๊ฐ ์ ๊ฒยท๊ตฌ์กฐ ์๊ฐํยท์ฅ์ ์๋ฎฌ๋ ์ด์
ยท๋ช
๋๋๋น ์คํฌ์ด๋ยท์ ๋ฌธ๊ฐ ํ์ ๋ง๋ณด๊ธฐ ๋ก๊ทธ์ธ ์์ด URL 1๊ฐ๋ฅผ ์ฆ์ ๊ฒ์ฌ(1ํ์ด์ง) โ ๋๋ฉ์์ ๋ฐ๋ก ์ฒดํ, ๋ด ๋ฐฉ์งยทํ์ ์ ํ ์ด์ ๋๋ฉ์ธ ์์ ํ์ธ, ์ ๊ธฐ ์๋ ์ ๊ฒ, ํ๊ท ์๋ฆผ, ์๋ฒ ๋ ๋ฐฐ์ง, ๊ณต๊ฐ ์ ๊ฒ ๋ชฉ๋ก, ์น๊ตฌ ์ด๋ ๋ฑ๊ธ CI GitHub Action์ผ๋ก PRยท๋ฐฐํฌ ์ ์๋ ๊ฒ์ฌ ๊ฒ์ดํธ โ ์ฌ์ฉ๋ฒ MCP Claude CodeยทCursor ๋ฑ AI ์ฝ๋ฉ ๋๊ตฌ๊ฐ ๊ฒ์ฌยทํ๊ตญ์ด ๊ฐ์ด๋๋ฅผ ์ง์ ํธ์ถ โ ์ฌ์ฉ๋ฒ
CI์์ ๋ฐ๋ก ์ฐ๊ธฐ
PR๋ง๋ค ์ง์ ํ์ด์ง๋ฅผ ๊ฒ์ฌํ๊ณ , ์ฌ๊ฐ ์ด์ ์๋ฐ์ด ์์ผ๋ฉด ์ก์ ์คํจ์ํต๋๋ค.
๊ฒฐ๊ณผ๋ ์ก ์์ฝ์ Markdown ํ๋ก ๋จ์ต๋๋ค.
- uses: IsaacEryn/a11ychk@v1
with:
urls: |
https://example.com/
https://example.com/login
fail-on: serious
์
๋ ฅยท์ถ๋ ฅ๊ณผ ๋ฒ์ ๊ณ ์ ๋ฐฉ๋ฒ์ docs/github-action.md ์ ์์ต๋๋ค.
AI ์ฝ๋ฉ ๋๊ตฌ์์ ๋ฐ๋ก ์ฐ๊ธฐ (ํ๋ฌ๊ทธ์ธ ยท MCP)
Claude Code์์๋ ํ๋ฌ๊ทธ์ธ ํ๋๋ก ๊ฐ์ฌ ์คํฌ 2์ข
๊ณผ ๊ฒ์ฌ ์์ง(MCP ์๋ฒ)์ด ํจ๊ป ์ค์น๋ฉ๋๋ค.
๊ฐ๋ฐ ์ค์ธ localhost ํ์ด์ง๋ฅผ ๊ทธ ์๋ฆฌ์์ ๊ฒ์ฌํ๊ณ , ์๋ฐ๋ง๋ค ํ๊ตญ์ด ๊ฐ์ ๊ฐ์ด๋๋ฅผ ๋ฐ์
์์ ํ๊ณ , ์ฌ๊ฒ์ฌ๊น์ง ํ ๋ํ์์ ๋๋๋ค.
/plugin marketplace add IsaacEryn/a11ychk
/plugin install a11ychk@a11ychk
/a11ychk:a11y-audit โ ๊ฒ์ฌ โ ์์ โ ์ฌ๊ฒ์ฌ ๋ฃจํ (๋ฐฐํฌ ์ ์ ๊ฒ)
/a11ychk:kwcag-audit โ KWCAG 2.2 33๊ฐ ๊ฒ์ฌํญ๋ชฉ ๊ด์ ์ ๊ฒ
MCP ์๋ฒ๋ง ์ฐ๋ ค๋ฉด (Cursor ๋ฑ ๋ค๋ฅธ ํด๋ผ์ด์ธํธ ํฌํจ):
claude mcp add a11ychk -- npx -y @a11ychk/mcp
{
"mcpServers" : {
"a11ychk" : { "command" : "npx" , "args" : [ "-y" , "@a11ychk/mcp" ] }
}
}
๋๊ตฌ ๊ตฌ์ฑ๊ณผ ์ค์น ์๋ด๋ docs/mcp.md ์ ์์ต๋๋ค.
๊ตฌ์กฐ (npm workspaces ๋ชจ๋
ธ๋ ํฌ)
packages/core @a11ychk/core โ ๊ฒ์ฌ ์์ง (์คํ์์ค์ ์ฌ์ฅ)
src/crawler/ ๋ํ ํ์ด์ง ์์ง (sitemap โ ๋ด๋ถ ๋งํฌ, robots.txt ์กด์ค)
src/scanner/ axe-core ์คํยท๊ฒฐ๊ณผ ์ ๊ทํ (Playwright Page ์ฃผ์
ํ) + 2-ํจ์ค ์์ ์ฑ ํํฐ
src/catalog/ ๊ท์น ์นดํ๋ก๊ทธ โ WCAG 2.2 ยท KWCAG 2.2 ์ด์ค ๋งคํ + ํ๊ตญ์ด ๊ฐ์ ๊ฐ์ด๋
src/manual/ ์๋ ๊ฒ์ฌ ํญ๋ชฉ ์ ์ (KWCAG 33๊ฐ ์ค ์๋ ํ์ ๋ถ๊ฐ ํญ๋ชฉ)
src/report/ ๋ณด๊ณ ์ ์ง๊ณ (์ค์์จ, KWCAG ๋งคํธ๋ฆญ์ค, ์ฌ์ดํธ ์์ค ๊ฒ์ฌ)
src/security/ SSRF ๊ฐ๋ (์ฌ์ค IPยทDNS ๋ฆฌ๋ฐ์ธ๋ฉยทredirect ์ฐจ๋จ), robots.txt ํ์
packages/mcp @a11ychk/mcp โ AI ์ฝ๋ฉ ๋๊ตฌ์ฉ MCP ์๋ฒ (npm)
apps/web Next.js 16 ์๋น์ค ์ฑ (a11ychk.com)
apps/extension ํฌ๋กฌ ํ์ฅ (MV3 Side Panel)
action GitHub Action ๋ฌ๋ (์ํฌ์คํ์ด์ค ๋ฐ ๋
๋ฆฝ ํจํค์ง โ ์๋น์ CI๊ฐ ์ง์ ์ค์น)
supabase DB ๋ง์ด๊ทธ๋ ์ด์
+ RLS ์ ์ฑ
docs ์ํคํ
์ฒ ยท ๋ก๋๋งต ยท ์ด์ ์ค์
์์ํ๊ธฐ
npm install
cp apps/web/.env.example apps/web/.env.local
npx playwright install chromium
npm run dev
ํฌ๋กฌ ํ์ฅ์ **ํฌ๋กฌ ์น์คํ ์ด **์์
๋ฐ๋ก ์ค์นํ ์ ์์ต๋๋ค. ์์ค์์ ๋น๋ํ๋ ค๋ฉด npm run build -w @a11ychk/extension โ
apps/extension/dist๋ฅผ chrome://extensions์์ ์์ถ ํด์ ๋ก๋. Supabase ์ค์ ์ docs/SETUP.md ์ฐธ๊ณ .
๊ธฐ์ ์คํ
Next.js 16 (App Router) ยท TypeScript ยท Tailwind CSS v4 ยท next-intl(ko/en) ยท
Supabase (Auth + PostgreSQL/RLS) ยท playwright-core + @sparticuz/chromium ยท axe-core 4.12 ยท Zod ยท Vercel
ํ
์คํธ
npm run test
npm run test :e2e -w @a11ychk/core
npm run typecheck && npm run lint
๋ณด์ ์์น
๋ชจ๋ ์ํฌ๋ฆฟ์ ํ๊ฒฝ๋ณ์๋ก๋ง ๊ด๋ฆฌ โ ์ ์ฅ์์๋ .env.example๋ง ์กด์ฌ
์ฌ์ฉ์ ์
๋ ฅ URL์ SSRF ๊ฐ๋(์คํด ๊ฒ์ฆ โ DNS resolve โ ์ฌ์ค ๋์ญ ์ฐจ๋จ โ ๋ธ๋ผ์ฐ์ DNS ํ โ redirect ์ฌ๊ฒ์ฆ)๋ฅผ ํต๊ณผ
Supabase RLS๋ก ์ฌ์ฉ์ ๋ฐ์ดํฐ ๊ฒฉ๋ฆฌ, service role์ ์๋ฒ์์ ๊ถํ ๊ฒ์ฆ ํ์๋ง ์ฌ์ฉ
๊ฒ์ฌ ํ์ ์ ํ(์ผ/์ฃผ/์) + robots.txt ์กด์ค, CSP nonceยทํ์ค ๋ณด์ ํค๋ ์ ์ฉ
๊ธฐ์ฌ
๊ท์น ์นดํ๋ก๊ทธ(packages/core/src/catalog )์ ํ๊ตญ์ด ๊ฐ์ ๊ฐ์ด๋ ๋ณด๊ฐยท๋งคํ
๊ต์ ยท์ ๊ท์น ์ ์ PR์ ๊ฐ์ฅ ํ์ํฉ๋๋ค. ์ฝ๋๊ฐ ์๋์ด๋ ๊ธฐ์ฌ์
๋๋ค โ CONTRIBUTING.md ์ฐธ๊ณ .
๋์์ด ๋์๋ค๋ฉด โญ๏ธ Star ๋ก ํ๋ก์ ํธ๋ฅผ ์์ํด ์ฃผ์ธ์. ํ๊ตญ์ด ์ ๊ทผ์ฑ ๋๊ตฌ ์ํ๊ณ๋ฅผ ํจ๊ป ํค์๋๋ค.
๋ผ์ด์ ์ค
๋ถํ ๋ผ์ด์ ์ฑ โ ์์ธํ ๋ด์ฉ์ LICENSING.md ์ฐธ๊ณ .
๊ฒ์ฌ ์์งยท๊ท์น ์นดํ๋ก๊ทธ (packages/core) ยท MCP ์๋ฒ (packages/mcp) ยท ํฌ๋กฌ ํ์ฅ
(apps/extension) ยท GitHub Action (action/) โ Apache-2.0 :
์์ ๋กญ๊ฒ ์ฌ์ฉยท์์ ยท์ฌ๋ฐฐํฌยทํตํฉํ ์ ์์ต๋๋ค.
์๋น์ค ์ฑ (apps/web) โ AGPL-3.0-only : ์ด๋ ค ์์ง๋ง, ์ด ์ฑ์ ์์ ํด
๋คํธ์ํฌ ์๋น์ค๋ก ์ด์ํ๋ฉด ์์ ์์ค๋ฅผ ๊ณต๊ฐํด์ผ ํฉ๋๋ค.