본문으로 건너뛰기

브라우저가 해 주는 검사

HTML·CSS 목차폼레슨 35 / 93

목차

required · min · max · type="email" 같은 속성을 칸에 적으면, 브라우저가 보내기 전에 칸의 값을 검사합니다. 맞지 않는 칸이 있으면 제출을 멈추고, 첫 칸 하나에 말풍선으로 까닭을 띄웁니다.

이름을 비운 채 보내거나 별점에 0을 넣는 일은 흔합니다. 받는 쪽까지 갔다가 되돌아오기 전에, 친 사람의 화면에서 바로 알려 주면 고치기 쉽습니다. 이 검사는 속성 하나로 켜집니다. 이 레슨에서는 검사 속성마다 무엇을 막는지, 막힌 제출에서 브라우저가 무엇을 하는지, 그리고 이 검사가 하지 못하는 일을 봅니다.

7단계 중 1단계. 이름 칸이 비어 제출이 멈추고, 그 칸에 말풍선 '이 입력란을 작성하세요.'가 뜹니다.

1속성마다 막는 것이 다르다

말풍선 문구는 크롬 한국어 화면의 원문입니다.

속성막는 것말풍선(크롬 한국어)
required비운 칸이 입력란을 작성하세요.
min="1"1보다 작은 수값은 1 이상이어야 합니다.
max="5"5보다 큰 수값은 5 이하여야 합니다.
type="email"@ 기호가 없는 값이메일 주소에 '@'를 포함해 주세요. 'abc'에 '@'가 없습니다.
maxlength="20"21째 글자부터없음 — 더 쳐지지 않는다

required는 값 없이 이름만 적는 속성이고, min · max는 숫자 칸(type="number")에 씁니다.

<label for="nick">이름</label>
<input
  id="nick"
  name="nickname"
  required
/>
<label for="star">별점</label>
<input
  type="number"
  id="star"
  min="1"
  value="0"
/>
결과 화면
잰 값개발자 도구에서 본 값
  • #nick의 말풍선이 입력란을 작성하세요.
  • #star의 말풍선값은 1 이상이어야 합니다.

잰 값의 말풍선은 지금 칸의 값으로 보내면 뜰 말입니다. 이름 칸은 비어 있고, 별점 칸은 value="0"이라 1보다 작습니다. 결과 화면에서는 칸을 비운 채 단추를 눌러도 말풍선이 뜨지 않습니다. 결과 화면은 눌러도 떠나지 않아 검사도 일어나지 않습니다. 결과 화면 머리의 '눌러도 떠나지 않음'이 그 표시입니다. 말풍선은 위 흐름 그림과 잰 값 칸으로 보고, 내 파일에서 해 봅니다.

2막힌 제출 — 첫 칸 하나에 말풍선

<form>
  <label for="nick">이름</label>
  <input
    id="nick"
    name="nickname"
    required
  />
결과 화면

메일 칸도 required입니다. 두 칸을 모두 비운 채 '보내기'를 누릅니다.

  <label for="mail">메일</label>
  <input
    type="email"
    id="mail"
    name="mail"
    required
  />
  <button type="submit">
    보내기
  </button>
</form>
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소(떠나지 않음)
  • 지금 포커스의 읽는 이름이름

폼은 떠나지 않았고, 포커스는 첫 칸인 이름 칸에 있습니다.

  • 브라우저는 칸을 폼 안 차례로 보다가 맞지 않는 첫 칸에서 멈춥니다.
  • 그 칸으로 커서를 옮기고, 그 칸 하나에만 말풍선을 띄웁니다. 메일 칸도 비었지만 말풍선은 이름 칸을 고친 뒤 다시 보낼 때 뜹니다.
  • 모든 칸이 맞아야 폼이 떠납니다.

위 흐름 그림에서 폼이 떠나 간 주소 끝의 mail=a%40b.c는 메일 칸에 친 a@b.c입니다. 한글이 % 꼴이 되듯 @도 주소에서는 %40이 됩니다.

예제

후기 폼의 이름 칸과 별점 칸입니다. 이름은 꼭 쓰고 20자까지, 별점은 1에서 5 사이로 받습니다.

<form>
  <label for="nick">이름</label>
  <input
    id="nick"
    name="nickname"
    required
    maxlength="20"
  />
결과 화면
  <label for="star">별점</label>
  <input
    type="number"
    id="star"
    name="rating"
    min="1"
    max="5"
    required
  />
  <button type="submit">
    보내기
  </button>
</form>
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?nickname=haneul&rating=5

이름에 haneul, 별점에 5를 치고 보내자 검사를 모두 지나 떠났습니다. 한 칸에 검사 속성을 여럿 적으면 모두 맞아야 지납니다.

자주 틀리는 곳

틀린 생각: 브라우저가 검사했으니 받는 쪽에는 맞는 값만 온다.

<form>
  <label for="star">별점</label>
  <input
    type="number"
    id="star"
    name="rating"
    min="1"
    max="5"
  />
</form>
<a href="?rating=0">0점 보내기</a>
결과 화면
잰 값개발자 도구에서 본 값
  • a의 주소?rating=0

링크 하나로 ?rating=0이 붙은 주소로 갔습니다. 폼을 거치지 않으니 검사도 없습니다. 주소창에 그 주소를 직접 쳐도 같습니다.

맞는 규칙: 브라우저의 검사는 친 사람을 돕는 것일 뿐, 값을 지켜 주지 않습니다. 받는 쪽 프로그램이 값을 다시 검사해야 하고, 그것은 이 과목 밖의 일입니다.

틀린 생각: 말풍선 문구는 어느 브라우저에서나 같다.

<label for="mail">메일</label>
<input
  type="email"
  id="mail"
  name="mail"
  value="kimchi"
/>
결과 화면
잰 값개발자 도구에서 본 값
  • #mail의 말풍선이메일 주소에 '@'를 포함해 주세요. 'kimchi'에 '@'가 없습니다.

같은 크롬에서도 문구에 친 값 kimchi가 들어가 값마다 달라집니다. 크롬을 다른 언어로 쓰거나 다른 브라우저로 열면 문구와 말풍선 모양이 또 다릅니다.

맞는 규칙: 말풍선을 띄우는 것은 브라우저이고, 문구와 모양은 브라우저와 언어마다 다릅니다. 레슨의 문구는 크롬 한국어 기준입니다. 페이지에는 칸 이름과 라벨로 무엇을 칠지 알려 둡니다.

틀린 생각: maxlength를 넘기면 말풍선이 뜬다.

<label for="nick">이름</label>
<input
  id="nick"
  name="nickname"
  maxlength="6"
/>
결과 화면
잰 값개발자 도구에서 본 값
  • #nick의 값haneul
  • #nick의 말풍선(없음)

haneulsky를 쳤지만 칸에는 여섯 자 haneul까지만 들어갔습니다. 말풍선은 없습니다.

맞는 규칙: maxlength는 그보다 길게 쳐지지 않게 막을 뿐, 말풍선을 띄우지 않습니다. 몇 자까지인지는 라벨 글로 알려 둡니다.

확인 문제

1. 예제 폼에서 이름에 haneul, 별점에 9를 치고 '보내기'를 누르면 어떻게 될까요?

<form>
  <label for="nick">이름</label>
  <input
    id="nick"
    name="nickname"
    required
    maxlength="20"
  />
  <label for="star">별점</label>
  <input
    type="number"
    id="star"
    name="rating"
    min="1"
    max="5"
    required
  />
  <button type="submit">
    보내기
  </button>
</form>
  • ① 떠난다 — 주소에 rating=9가 붙는다
  • ② 멈춘다 — 별점 칸에 '값은 5 이하여야 합니다.'
  • ③ 멈춘다 — 이름 칸에 '이 입력란을 작성하세요.'
힌트

두 칸의 값을 칸마다 적힌 검사 속성과 하나씩 견줘 봅니다.

정답

② — 멈추고 별점 칸에 말풍선이 뜹니다.

결과 화면
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소(떠나지 않음)
  • 지금 포커스의 읽는 이름별점
  • #star의 말풍선값은 5 이하여야 합니다.

이름 칸은 haneul로 맞고, 별점 9는 max="5"보다 커서 맞지 않는 첫 칸입니다. 브라우저는 그 칸으로 커서를 옮기고 말풍선을 띄웁니다.

  • ① 숫자 칸이면 아무 숫자나 지난다고 본 것입니다. max가 5보다 큰 수를 막습니다.
  • ③ 말풍선이 늘 첫 칸에 뜬다고 본 것입니다. 뜨는 곳은 맞지 않는 첫 칸입니다.

2. 이름을 비운 채 보내면 막히게 하려고 합니다. ____ 자리에 들어갈 것을 쓰세요.

<input
  id="nick"
  name="nickname"
  ____
/>
힌트

비운 칸을 막는 속성을 1절 표에서 찾아봅니다.

정답

required입니다. 값 없이 이름만 적습니다. required="false"처럼 값을 적어도 속성이 있으면 켜집니다 — 끄려면 속성을 지웁니다.

3. 동아리 공지 페이지의 가입 신청 폼입니다. 메일 칸에 abc를 쳤는데 막히지 않고 신청이 보내졌습니다. 몇 번 줄을 어떻게 고칠까요?

<form>
  <label for="mail">메일</label>
  <input
    type="text"
    id="mail"
    name="mail"
    required
  />
  <button type="submit">
    신청
  </button>
</form>
힌트

메일 꼴을 검사하는 것이 1절 표의 어느 줄인지 보고, 이 칸에 그것이 있는지 봅니다.

정답

4번 줄을 type="email"로 고칩니다.

결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소?mail=abc

type="text" 칸은 무엇이든 받아, required는 비우지만 않으면 지나갑니다. 고치면 abc에서 멈춥니다.

<form>
  <label for="mail">
    메일
  </label>
  <input
    type="email"
    id="mail"
    name="mail"
    required
  />
  <button type="submit">
    신청
  </button>
</form>
결과 화면
잰 값개발자 도구에서 본 값
  • form의 주소(떠나지 않음)
  • #mail의 말풍선이메일 주소에 '@'를 포함해 주세요. 'abc'에 '@'가 없습니다.

흔한 오답은 required를 하나 더 적는 답입니다. required는 비운 칸만 막고, 꼴은 보지 않습니다.

컴퓨터에서 해 보기(선택) — 점수에 들지 않습니다. 폰으로만 보고 있다면 건너뛰세요. 예제 폼을 html-css-study 폴더에 check.html로 저장해 엽니다. 두 칸을 비운 채 보내 보고, 이름만 친 뒤 별점에 0 · 9 · 3을 차례로 넣어 보냅니다. 보내기 전마다 말풍선이 어느 칸에 무엇으로 뜰지 먼저 적고 맞춰 봅니다. 그다음 이름 칸의 required를 지우고 비운 채 보내 봅니다.

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

HTML·CSS 목차로