프론트엔드 체크리스트는 당신의 HTML 사이트 또는 페이지를 프로덕션으로 런칭하기 이전에 가지고 있어야 할, 또한 테스트 되어야 할 전반적인 요소들의 집합입니다.
이 리스트는 다년간의 프론트엔드 개발자들의 경험으로 작성되었으며, 몇몇 항목들은 타 오픈소스 체크리스트들의 참고를 통해 추가되었습니다.
프론트엔드 체크리스트에 속해있는 모든 항목들은 대다수의 프로젝트에서 필요로 하는 사항들이지만, 몇몇 요소들은 생략되거나 필수적이 아닐 수도 있습니다(예를 들면 관리형 웹 어플리케이션의 경우 RSS 피드는 필요 없을 것입니다). 우리는 따라서 각각의 항목들을 3가지의 기준으로 구분하였습니다:
의 경우 해당 항목이 권유 되지만, 몇몇 특정한 상황에서는 생략될 수도 있습니다.
의 경우 해당 항목이 권고 되지만, 굉장히 특정한 상황에서는 결국 생략이 될 수도 있습니다. 몇몇 요소의 경우, 생략 시 성능이나 SEO 측면에서 안 좋은 영향을 끼칠 수도 있습니다.
의 경우 해당 항목은 어떠한 상황에서라도 생략될 수 없습니다. 이를 생략하게 되면 당신의 페이지는 오동작하거나 접근, 또는 SEO에 문제가 발생할 것입니다. 이러한 요소들에 대해서 우선적으로 테스트 하시기 바랍니다.
몇몇 추가 내용들은 그것들이 어떠한 종류의 내용인지 이해하는데에 도움을 주기 위하여 이모티콘을 추가하였습니다. 이로 인해 체크리스트에서 해당 항목들을 이해하는 데에 도움이 될 것입니다:
- 📖: 문서 또는 기사
- 🛠: 온라인 도구 / 테스트 도구
- 📹: 미디어 또는 비디오 컨텐츠
노트: a list of everything 에서 HTML 문서 내의
<head>에서 사용할 수 있는 모든 것을 찾아보실 수 있습니다.
<!-- Doctype HTML5 -->
<!doctype html>다음 3개의 메타 태그(Charset, X-UA Compatible and Viewport)들은 다른 요소들에 비해 head 안에서도 상단에 위치해야만 합니다.
<!-- 이 문서에 대한 문자 인코딩을 설정 -->
<meta charset="utf-8"><!-- Internet Explorer에게 최신의 렌더링 엔진을 사용하라고 지시 -->
<meta http-equiv="x-ua-compatible" content="ie=edge"><!-- 반응형 웹 디자인을 위한 Viewport 설정 -->
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover">- Title:
모든 페이지에 title이 사용됨 (SEO 가이드: Google은 제목에 사용된 글자들의 너비의 픽셀 값을 계산한 뒤, 472~482px 사이의 값으로 잘라냅니다. 평균적인 글자 길이의 제한은 약 55개의 글자입니다.)
<!-- 문서의 Title -->
<title>55개 이하의 문자로 구성된 페이지 제목</title><!-- Meta Description -->
<meta name="description" content="페이지에 대한 설명 (150개 이하의 문자)">- Favicons:
각각의 favicon이 제대로 생성되었고 올바르게 보여지는가? 만약
favicon.ico파일만 가지고 있다면, 해당 내용을 페이지의 상단부에 추가하라. 일반적으로는 해당 태그를 사용할 필요는 없지만, 아래의 예시를 포함하는 것이 좋은 습관임. 오늘날에는.ico포맷보다 PNG 포맷의 아이콘 사용을 추천함(크기: 32x32px).
<!-- 표준 favicon -->
<link rel="icon" type="image/x-icon" href="https://example.com/favicon.ico">
<!-- 추천 favicon 포맷 -->
<link rel="icon" type="image/png" href="https://example.com/favicon.png"><!-- Apple 터치 아이콘 (최소한 200x200 px) -->
<link rel="apple-touch-icon" href="/custom-icon.png">
<!-- To run web application in full-screen -->
<meta name="apple-mobile-web-app-capable" content="yes">
<!-- Status Bar Style (see Supported Meta Tags below for available values) -->
<!-- Has no effect unless you have the previous meta tag -->
<meta name="apple-mobile-web-app-status-bar-style" content="black"><!-- Microsoft 타일 -->
<meta name="msapplication-config" content="browserconfig.xml" />browserconfig.xml 파일에서 사용되는 최소한의 XML 내용은 다음과 같습니다:
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square70x70logo src="small.png"/>
<square150x150logo src="medium.png"/>
<wide310x150logo src="wide.png"/>
<square310x310logo src="large.png"/>
</tile>
</msapplication>
</browserconfig><link rel="canonical" href="http://example.com/2017/09/a-new-article-to-read.html"><html lang="ko"><!-- rtl: right to left -->
<html dir="rtl"><link rel="alternate" href="https://en.example.com/" hreflang="en">-
CSS Critical:
페이지가 로딩되는 즉시(펼쳐지는 그 순간) 컨텐츠에 영향을 끼치는 CSS를 "critical CSS" 라고 함. 이는 당신의 실질적인 어플리케이션의 CSS 가 로딩되기 이전에
<style></style>태그 사이에 최소화 된 상태로 한 줄로 추가되어 임베딩 됨
- 🛠 Critical by Addy Osmani on Github 이 레포는 CSS Critical을 자동화 하는데에 도움을 줍니다.
- Facebook Open Graph:
모든 Facebook의 Open Graph (OG) 가 테스트 되었으며, 그것들 중에 누락된 정보나 잘못된 정보를 가지고 있지는 않나? (이미지의 경우 최소한 600 x 315 픽셀은 되어야 하며, 1200 x 630 픽셀 크기를 권장함)
노트:
og:image:width와og:image:height를 사용하는 것은 이미지의 크기를 웹 크롤러에게 알려주어서, 이미지를 비동기적으로 다운로드하고 처리할 필요 없이 즉시 보여줄 수 있도록 합니다.
<meta property="og:type" content="website">
<meta property="og:url" content="https://example.com/page.html">
<meta property="og:title" content="Content Title">
<meta property="og:image" content="https://example.com/image.jpg">
<meta property="og:description" content="Description Here">
<meta property="og:site_name" content="Site Name">
<meta property="og:locale" content="en_US">
<!-- 다음의 태그는 필수는 아니지만, 포함하는 것을 추천함 -->
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
- 📖 웹마스터를 위한 쉐어링 가이드
- 📖 쉐어링 - 모범 사례
- 🛠 Facebook OG testing 도구를 이용하여 당신의 페이지 테스트하기
<meta name="twitter:card" content="summary">
<meta name="twitter:site" content="@site_account">
<meta name="twitter:creator" content="@individual_account">
<meta name="twitter:url" content="https://example.com/page.html">
<meta name="twitter:title" content="Content Title">
<meta name="twitter:description" content="Content description less than 200 characters">
<meta name="twitter:image" content="https://example.com/image.jpg">
- 📖 Twitter cards 시작하기 — Twitter Developers
- 🛠 Twitter card 검사기 도구를 이용하여 당신의 페이지 테스트하기
-
에러 페이지:
에러를 위한 404 페이지와 5xx 페이지가 존재하는가? 5xx 페이지는 서버로부터의 데이터를 전송받지 않고 독립적인 자체 CSS를 포함하고 있어야 함을 기억하라 (5xx 에러는 서버 에러이므로!).
-
Noopener:
외부 링크를
target="_blank"를 이용하여 연 경우, tab nabbing 피싱 공격을 방지하기 위하여rel="noopener"속성을 사용해야만 한다. 만약 Firefox 옛 버전을 지원해야만 한다면,rel="noopener noreferrer"을 사용하라.
- 🛠 W3C 검사기
- 🛠 Dirty markup: HTML 코드를 정돈해주는 온라인 도구
노트: 웹폰트를 사용하면 스타일링 되지 않은 글자나 보이지 않는 글자들이 깜빡일 수 있습니다. 실패했을 경우를 대비한 대체용 폰트를 포함하거나, 웹폰트 로더를 활용하여 이러한 동작들을 제어하세요.
노트: 대다수의 프론트엔드 개발자들이 따르는 CSS 가이드라인과 Sass 가이드라인 을 살펴보세요. 만약 모르는 CSS 속성 값이 있다면, CSS 레퍼런스를 참조하길 바랍니다. 또한 CSS의 일관성을 위한 코드 가이드도 읽어보기 바랍니다.
- 반응형 웹 디자인:
웹사이트가 반응형으로 디자인 됨
- CSS Print:
프린터가 사용할 print 스타일시트 값이 설정되었고, 각각의 페이지마다 올바르게 설정됨
- CSS 전처리기:
디자인에 CSS 전처리기를 이용함 (추천: Sass).
- 고유 ID값:
여러 개의 ID 값이 사용된 경우, 각각의 ID 값은 페이지 내에 고유해야함
- Reset CSS:
최신의 Reset CSS (reset, normalize나 reboot) 이 사용됨 (Bootstrap이나 Foundation 같은 CSS 프레임워크를 사용할 경우, Normalize가 이미 포함되어 있음)
- 📖 Reset.css
- 📖 Normalize.css
- 📖 Reboot
<div id="js-slider" class="my-slider">
<!-- 또는 -->
<div id="id-used-by-cms" class="js-slider my-slider">- CSS 임베딩 또는 인라인:
어떠한 경우에도 CSS를 직접 임베딩하거나 인라인으로 사용하지 마시오! 타당한 이유가 있는 경우에만 사용하시오 (예: 슬라이더 내의 background-image, 또는 CSS critical)
- 벤더 프리픽스:
CSS 벤더 프리픽스들이 사용되었고 브라우저 지원 호환성에 따라 알맞게 생성되었는지 확인
- 파일 단일화:
CSS 파일들이 하나의 CSS 파일로 단일화 되었음 (HTTP/2의 경우는 여러 개의 파일을 사용하는 것이 더 성능에 좋음)
- 최소화:
모든 CSS 파일들이 최소화 됨
- Non-blocking:
CSS 파일들은 DOM이 로딩하는데에 방해가 되지 않도록 비동기적으로 로드 되어야 함
- 🛠 CSS 검사기
- 데스크탑 브라우저:
모든 페이지가 모든 현존하는 데스크탑 브라우저에서 테스트 됨 (Safari, Firefox, Chrome, Internet Explorer, EDGE... 등).
- 모바일 브라우저:
모든 페이지가 모든 현존하는 모바일 브라우저에서 테스트 됨 (Native browser, Chrome, Safari... 등).
- 운영체제:
모든 페이지가 모든 현존하는 운영체제에서 테스트 됨 (Windows, Android, iOS, Mac... 등).
- Pixel perfect:
페이지가 Pixel perfect한 상태(원래 의도했던 디자인대로 화면에 보여짐)인가? 창작물에 따라서 100% 정확하지 않을 수도 있지만, 의도했던 템플릿에 가까워야 함
노트: 이미지 최적화의 완전한 이해를 위해서는, Addy Osmani가 쓴 무료 ebook Essential Image Optimization 을 확인하세요.
- 🛠 Imagemin
- 🛠 ImageOptim를 사용하여 당신의 이미지를 무료로 최적화하세요
- 🛠 Kraken.io를 사용하여 png와 jpg을 꽤나 대단하게 최적화 할 수 있습니다. 파일 당 1MB에 대해서는 무료입니다.
- 레티나 디스플레이 지원:
레티나 디스플레이를 지원하기 위하여 당신의 현 레이아웃에 해당하는 2배, 또는 3배 이상 큰 이미지를 지원함
- 이미지 스프라이트:
작은 이미지의 경우 스프라이트 파일로 구성되어져 있음 (아이콘의 경우, SVG 스프라이트 이미지 일 수도 있음).
- 너비와 높이:
모든
<img>태그에 너비와 높이가 설정되었음 (px이나 %로 지정하지 마시오) - 대체 텍스트:
모든
<img>태그가 이미지를 잘 서술하는 대체 텍스트를 가지고 있음 (alt속성으로 부여)
- 인라인 자바스크립트:
HTML 코드와 섞어 자바스크립트 코드를 인라인으로 포함하지 않도록 하시오
- 파일 단일화:
자바스크립트 파일들이 하나의 자바스크립트 파일로 단일화 되었음
- 최소화:
모든 자바스크립트 파일이 최소화 되었음(뒤에
.min접미사를 붙이는 것을 추천)
- 자바스크립트 보안:
-
noscript태그:브라우저 내에 자바스크립트를 지원하지 않거나 꺼져 있을 경우를 고려하여 HTML 내에
<noscript>태그를 사용하시오. 이는 React.js 어플리케이션처럼 클라이언트 사이드에 렌더링이 굉장히 무거운 어플리케이션의 경우 굉장히 유용함. 다음의 예제 를 살펴보시오
<noscript>
이 어플리케이션을 실행시키기 위해선 자바스크립트를 활성화 시켜야 합니다.
</noscript>- 사이트 간 요청 위조(CSRF; Cross Site Request Forgery):
CSRF 공격을 방지하기 위하여 위하여 당신의 서버 쪽으로 발생하는 모든 HTTP 요청이 합법적이고 당신의 웹사이트나 어플리케이션으로부터 발생한 것임을 확신함
- Content Type Options:
Prevents Google Chrome and Internet Explorer from trying to mime-sniff the content-type of a response away from the one being declared by the server.
- 컨텐츠 보안 정책(CSP; Content Security Policy)
사이트 내의 컨텐츠가 어떻게 로딩되고, 어디서 로딩되도록 허가받았는지를 확인. 이를 적용함으로써 클릭재킹 공격을 방지할 수 있음
-
Lazy 로딩:
이미지, 스크립트, CSS 파일들이 lazy 로드 되어서 현 페이지의 응답시간을 향상시킴 (각 섹션의 자세한 부분을 참조하시오).
-
쿠키 크기: 쿠키를 사용한다면, 각 쿠키의 크기가 4096 바이트를 넘지 않고, 도메인 내에 20개 이상의 쿠키를 가지지 않도록 주의하시오
- 📖 쿠키 사양: RFC 6265
- 📖 쿠키
- 🛠 브라우저 쿠키의 제한점
- 서드 파티 컴포넌트:
공유하기 버튼처럼 외부 자바스크립트 파일에 의존하는 서드파티 iframe이나 컴포넌트의 경우, 가급적 정적인 컴포넌트로 교체하여서 외부 API 호출을 제한하고 사용자들의 활동들을 외부로 유출되지 않도록 하시오
- DNS resolution:
DNS of third-party services that may be needed are resolved in advance during idle time using
dns-prefetch.
<link rel="dns-prefetch" href="https://example.com">- Preconnection:
DNS lookup, TCP handshake and TLS negotiation with services that will be needed soon is done in advance during idle time using
preconnect.
<link rel="preconnect" href="https://example.com">- Prefetching:
Resources that will be needed soon (e.g. lazy loaded images) are requested in advance during idle time using
prefetch.
<link rel="prefetch" href="image.png">- Preloading:
Resources needed in the current page (e.g. scripts placed at the end of
<body>) in advance usingpreload.
<link rel="preload" href="app.js">노트: 유튜브의 재생 목록을 확인해보세요 A11ycasts with Rob Dodson 📹
- 🛠 대비율
- banner 역할:
<header>태그가role="banner"속성값을 가지고 있음 - navigation 역할:
<nav>태그가role="navigation"속성값을 가지고 있음 - main 역할:
<main>태그가role="main"속성값을 가지고 있음
- 🛠 Wave 테스트
- 키보드 네비게이션:
키보드만을 이용하여 웹사이트를 예측 가능하도록 움직일 수 있는지 테스트 하시오. 모든 인터랙티브 엘리먼트들은 접근 가능하고 사용 가능해야 함
- 스크린 리더:
모든 페이지들이 스크린 리더 (VoiceOver, ChromeVox, NVDA or Lynx) 테스트를 완료함
- 포커스 스타일링:
포커스 되지 않은 경우, 눈에 보이는 상태의 CSS로 대체되어야 함
- 📖 The robots.txt file
- 🛠 Google Robots 테스트 도구를 이용하여 당신의 robots.txt 파일을 테스트 해보세요
- 📖 구조화 된 데이터 소개 - Search - Google Developers
- 📖 RDFa - Linked Data in HTML
- 📖 JSON-LD
- 📖 Microdata
- 🛠 구조화 된 데이터 테스트 도구를 이용하여 당신의 페이지를 테스트 해보세요
- 🛠 구조화 된 데이터로 사용될 수 있는 단어들의 목록을 만들어보세요 Schema.org Full Heirarchy
<!-- Example: Pagination link tags for page 2 of a paginated list -->
<link rel="prev" href="https://example.com/?page=1">
<link rel="next" href="https://example.com/?page=3">프론트엔드 체크리스트는 다른 언어로도 이용 가능합니다. 모든 번역자들과 그들의 멋진 노력에 감사합니다!
- 🇯🇵 Japanese: miya0001/Front-End-Checklist
- 🇪🇸 Spanish: eoasakura/Front-End-Checklist-ES
- 🇨🇳 Chinese: JohnsenZhou/Front-End-Checklist
- 🇰🇷 Korean: kesuskim/Front-End-Checklist
- 🇧🇷 Portuguese: jcezarms/Front-End-Checklist
- 🇻🇳 Vietnamese: euclid1990/Front-End-Checklist
- 🇹🇼 Traditional Chinese: EngineLin/Front-End-Checklist
- 🇫🇷 French: ynizon/Front-End-Checklist
- 🇷🇺 Russian: ungear/Front-End-Checklist
- 🇹🇷 Turkish: eraycetinay/Front-End-Checklist
만약 당신이 프론트엔드 체크리스트의 규칙을 따르고 있다고 보여주길 원한다면, 하단의 배지를 README 파일에 추가하세요!
[](https://github.com/thedaviddias/Front-End-Checklist/)이슈를 새로 생성하거나 PR을 날려서 수정 사항이나 추가할 부분에 대해 알려주세요.
프론트엔드 체크리스트 레포지토리는 2개의 브랜치로 구성되어져 있습니다:
이 브랜치는 프론트엔드 체크리스트 웹사이트에 반영되는 README.md파일로 구성되어져 있습니다.
이 브랜치는 필요하다면 구조나 컨텐츠에 상당한 변화를 줄 수 있습니다. 간단한 에러 수정을 하거나 새로운 항목을 추가할 경우, master 브랜치에 직접 하는 것을 추천드립니다.
질문이나 제안이 있다면, 주저하지 말고 Gitter나 Twitter를 이용하세요:
This project exists thanks to all the people who contribute. [Contribute].
Thank you to all our backers! 🙏 [Become a backer]
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]

