HTML 폼 제출

HTML 폼 제출4분 분량

폼 제출 후 감사 페이지로 리디렉션하기

폼이 POST된 뒤 방문자를 직접 만든 감사 페이지로 보내세요. 303 리디렉션, _redirect 필드, 허용되는 도메인, 새로고침 시 동작을 다룹니다.

Preet SutharIkiform 창업자

폼은 스스로 리디렉션할 수 없습니다. POST를 받는 서버가 Location 헤더와 함께 303 See Other로 응답하고 브라우저가 그 페이지를 불러옵니다. Ikiform에서는 폼 설정의 Redirect after submit을 설정하거나, 폼의 Allowed domains 중 하나에 있는 https: URL로 숨겨진 _redirect 입력을 추가하세요. 둘 다 없으면 방문자는 Ikiform의 호스팅 감사 페이지로 이동합니다.

예시는 감사 페이지가 실제로는 다음 단계인 데모 요청 폼입니다. 방문자에게 시간을 고르라고 합니다. 그래서 리디렉션 대상이 평소보다 중요해지고, 이 페이지가 주로 다루는 질문이 생깁니다. 폼이 사람들을 어디로 보낼지 누가 정할 수 있는가입니다.

이 경우가 다른 점

HTML에는 "제출 후 여기로 이동"하는 속성이 없습니다. action은 데이터가 가는 곳이고, 그다음 페이지는 서버가 응답하는 무엇이든 됩니다. 그래서 리디렉션은 항상 받는 서버가 결정합니다. 그 서버가 Ikiform이라면 영향을 줄 수 있는 방법은 정확히 두 가지이고, 둘의 신뢰 수준은 다릅니다.

ItemRedirect after submit 설정_redirect 숨겨진 입력
설정하는 사람대시보드에서 워크스페이스 멤버페이지 HTML을 편집할 수 있는 누구나, 또는 방문자의 브라우저
허용되는 대상모든 http: 또는 https: URLhttps:만, 허용 도메인이나 그 서브도메인에서
범위폼 전체에 대상 하나페이지마다 하나, 즉 언어별 또는 캠페인별
둘 다 설정된 경우우선 적용무시됨

_redirect에 엄격한 규칙이 있는 이유는 그 값이 POST와 함께 도착하기 때문입니다. 규칙이 없으면 누구나 내 폼 URL을 POST하는 링크에 넣고 방문자를 피싱 페이지로 보낼 수 있으며, 이것이 오픈 리디렉션입니다.

성공한 POST 뒤 Ikiform이 브라우저를 보낼 곳을 고르는 방식1. Redirect after submit 설정됨2. _redirect가 규칙 통과3. 둘 다 없음성공한 POST대시보드 설정모든 http: 또는 https: URL그곳으로 303성공한 POST_redirect 또는 _nexthttps:, 허용 도메인, 포트 없음그곳으로 303성공한 POST호스팅 감사 페이지/f/<formId>/thanks그곳으로 303내 페이지로 돌아가는 링크성공한 POST 뒤 Ikiform이 브라우저를 보낼 곳을 고르는 방식1. Redirect after submit 설정됨2. _redirect가 규칙 통과3. 둘 다 없음성공한 POST대시보드 설정모든 http: 또는 https: URL그곳으로 303성공한 POST_redirect 또는 _nexthttps:, 허용 도메인, 포트 없음그곳으로 303성공한 POST호스팅 감사 페이지/f/<formId>/thanks그곳으로 303내 페이지로 돌아가는 링크
  1. 폼 설정에 Redirect after submit URL이 있으면 Ikiform은 그곳으로 303을 응답하고 더 보지 않습니다.
  2. 그렇지 않고 POST에 포트나 자격 증명 없이 허용 도메인에 있는 https URL인 _redirect 또는 _next 필드가 있으면 Ikiform이 그곳으로 리디렉션합니다.
  3. 그 밖에는 Ikiform이 호스팅 감사 페이지로 리디렉션하며, 허용 도메인의 https 페이지에서 온 POST라면 그 페이지로 돌아가는 링크가 있습니다.
처음 일치하는 것이 적용됩니다. 규칙에 맞지 않는 _redirect는 조용히 다음으로 넘어가며, 절대 오류가 되지 않습니다.

폼

demo.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="post">
  <label for="email">Work email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />

  <label for="company">Company</label>
  <input id="company" name="company" autocomplete="organization" required />

  <label for="team_size">Team size</label>
  <select id="team_size" name="team_size">
    <option value="1-10">1 to 10</option>
    <option value="11-50">11 to 50</option>
    <option value="51+">51 or more</option>
  </select>

  <input type="hidden" name="_redirect" value="https://example.com/demo/next-step" />
  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Request a demo</button>
</form>

폼의 Allowed domains에 example.com을 추가하면 이 폼은 POST하고 303을 받아 /demo/next-step으로 이동합니다. 감사 페이지는 내 사이트의 평범한 HTML입니다.

demo/next-step.html
<!doctype html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <meta name="robots" content="noindex" />
    <title>Thanks, pick a time</title>
  </head>
  <body>
    <h1>Thanks. One more step.</h1>
    <p>Pick a time for your demo. You'll get a calendar invite right away.</p>
    <p><a href="https://cal.example.com/acme/demo">Choose a time</a></p>
  </body>
</html>
  • noindex는 검색 결과에 나오지 않게 합니다. Google에서 그곳으로 오는 사람은 없어야 하며, 분석 도구에서 감사 페이지가 진입 페이지로 잡힌다면 무언가가 그곳으로 링크하고 있다는 신호입니다.
  • 새로고침해도 안전합니다. Ikiform이 303으로 응답했으므로 브라우저는 이 페이지를 GET으로 불러왔고, 다시 불러와도 아무것도 다시 보내지 않습니다.
  • 이 페이지에서 전환을 센다면 세션당 한 번만 세세요. 새로고침이나 북마크로 다시 불러와지며, 실제 수는 Ikiform 대시보드가 기준입니다.

다른 사이트로 리디렉션하기

내 페이지를 건너뛰고 cal.example.com이나 일정 서비스의 도메인처럼 다른 도메인의 예약 도구로 바로 보내고 싶다고 해 봅시다. _redirect를 쓰면 그 도메인이 Allowed domains에 있어야 하는데, 이 목록에는 두 번째 역할이 있습니다. 어떤 사이트가 폼으로 POST할 수 있는지 정하는 것입니다. 일정 서비스의 도메인을 추가하면 그 도메인의 페이지도 내 폼으로 POST할 수 있게 됩니다.

대신 폼 설정의 Redirect after submit을 쓰세요. 내 워크스페이스만 설정할 수 있으므로 어떤 URL이든 받으며, Allowed domains에는 내 사이트만 남겨 둘 수 있습니다.

Ikiform은 주어진 URL 그대로 리디렉션합니다. 제출 id나 필드 값을 덧붙이지 않으므로 예약 페이지를 리디렉션으로 미리 채울 수는 없습니다. 그곳에서 이메일을 다시 묻거나, 직접 만든 감사 페이지에서 예약 페이지로 링크하세요.

폼마다 다른 페이지

대시보드 설정은 폼당 URL 하나입니다. 한 폼이 서로 다른 감사 페이지가 필요한 여러 페이지에 있다면 설정을 비워 두고 각 페이지에 고유한 _redirect를 주세요. 독일어 페이지는 방문자를 독일어 감사 페이지로 보냅니다.

de/demo.html
<input type="hidden" name="_redirect" value="https://example.com/de/demo/danke" />

리디렉션에 값 추가하기

_redirect의 쿼리 문자열은 유지되므로 방문자가 고른 것을 감사 페이지로 넘길 수 있습니다. 브라우저 검증 뒤, 폼이 인코딩되기 전에 실행되는 submit 리스너에서 값을 설정하세요.

demo.js
const form = document.querySelector("form");
const redirect = form.elements.namedItem("_redirect");

form.addEventListener("submit", () => {
  const size = form.elements.namedItem("team_size").value;
  const next = new URL("https://example.com/demo/next-step");
  next.searchParams.set("size", size);
  redirect.value = next.href;
});

방문자는 /demo/next-step?size=11-50에 도착하고, 페이지는 그 팀 규모에 맞는 예약 링크를 보여 줄 수 있습니다. 개인정보가 아닌 값만 넣으세요. 쿼리 문자열은 브라우저 기록, 서버 로그, 분석 도구에 남습니다.

fetch 제출 뒤 리디렉션하기

fetch 호출은 리디렉션이 아니라 JSON을 받으므로 Ikiform의 리디렉션 규칙이 적용되지 않습니다. 응답이 ok이면 직접 이동하세요.

스크립트에서 리디렉션
const response = await fetch(form.action, {
  method: "POST",
  headers: { Accept: "application/json" },
  body: new FormData(form),
});
const result = await response.json();
if (result.ok) location.assign("/demo/next-step");

뒤로 가기 버튼이 폼으로 돌아가야 한다면 location.replace 대신 location.assign을 쓰세요. 새로고침 없는 제출 가이드에 오류와 로딩 상태를 포함한 전체 핸들러가 있습니다.

작동 확인하기

  1. 폼의 Allowed domains에 사이트 도메인을 추가하고, 개발하는 동안에는 localhost도 추가하세요. 비워 두면 어디서든 POST를 받습니다.
  2. 실제 페이지에서 폼을 제출하세요. 주소 표시줄에 감사 페이지가 보이고, Network 패널에 303으로 응답한 POST가 보입니다.
  3. 감사 페이지에서 새로고침을 누르세요. 브라우저가 다시 제출할지 묻지 않고, 대시보드에는 여전히 제출 하나만 있습니다.
  4. _redirect를 허용되지 않은 도메인의 주소로 바꾸고 제출하세요. 오류 없이 대신 Ikiform의 호스팅 감사 페이지로 이동합니다.
  5. 대시보드에서 Submissions를 여세요. 보낸 모든 필드가 담긴 새 제출이 있습니다.

주의할 점

문제원인과 해결
도메인이 허용되었는데도 _redirect가 무시됨폼 설정에 Redirect after submit이 설정되어 있으며 항상 우선합니다. 페이지별 리디렉션을 쓰려면 비우세요
프로덕션에서는 동작하지만 localhost에서는 안 됨_redirect는 포트 없는 https:여야 하므로 http://localhost:3000/thanks는 절대 통과하지 않습니다. 미리보기 배포에서 테스트하거나, 로컬에서는 호스팅 페이지를 받아들이세요
호스팅 감사 페이지에 내 사이트로 돌아가는 링크가 없음폼의 허용 도메인 중 하나에 있는 https: 페이지에서 온 POST일 때만 링크가 생깁니다. 도메인을 추가하거나 직접 만든 페이지로 리디렉션하세요
브라우저가 내 페이지가 아니라 Ikiform의 감사 페이지로 이동합니다_redirect는 도메인이 Allowed domains에 있고 https: URL일 때만 따릅니다. 도메인을 추가하거나, 대신 폼 설정에서 Redirect after submit을 설정하세요.
감사 페이지가 검색 결과에 나옴페이지에 <meta name="robots" content="noindex">를 추가하고, 내비게이션에서 링크하지 마세요

통과하는 URL과 실패하는 URL 예시를 포함한 정확한 규칙은 HTML 폼에 있습니다. 개요는 응답이 302나 200이 아니라 303인 이유를 설명합니다.

질문

막히는 단계가 있거나 내 상황에 맞는 가이드가 필요하다면 이메일을 보내세요: hello@ikiform.com.