HTML 폼 제출4분 분량
폼 제출 후 감사 페이지로 리디렉션하기
폼이 POST된 뒤 방문자를 직접 만든 감사 페이지로 보내세요. 303 리디렉션, _redirect 필드, 허용되는 도메인, 새로고침 시 동작을 다룹니다.
폼은 스스로 리디렉션할 수 없습니다. POST를 받는 서버가 Location 헤더와 함께 303 See Other로 응답하고 브라우저가 그 페이지를 불러옵니다. Ikiform에서는 폼 설정의 Redirect after submit을 설정하거나, 폼의 Allowed domains 중 하나에 있는 https: URL로 숨겨진 _redirect 입력을 추가하세요. 둘 다 없으면 방문자는 Ikiform의 호스팅 감사 페이지로 이동합니다.
예시는 감사 페이지가 실제로는 다음 단계인 데모 요청 폼입니다. 방문자에게 시간을 고르라고 합니다. 그래서 리디렉션 대상이 평소보다 중요해지고, 이 페이지가 주로 다루는 질문이 생깁니다. 폼이 사람들을 어디로 보낼지 누가 정할 수 있는가입니다.
이 경우가 다른 점
HTML에는 "제출 후 여기로 이동"하는 속성이 없습니다. action은 데이터가 가는 곳이고, 그다음 페이지는 서버가 응답하는 무엇이든 됩니다. 그래서 리디렉션은 항상 받는 서버가 결정합니다. 그 서버가 Ikiform이라면 영향을 줄 수 있는 방법은 정확히 두 가지이고, 둘의 신뢰 수준은 다릅니다.
| Item | Redirect after submit 설정 | _redirect 숨겨진 입력 |
|---|---|---|
| 설정하는 사람 | 대시보드에서 워크스페이스 멤버 | 페이지 HTML을 편집할 수 있는 누구나, 또는 방문자의 브라우저 |
| 허용되는 대상 | 모든 http: 또는 https: URL | https:만, 허용 도메인이나 그 서브도메인에서 |
| 범위 | 폼 전체에 대상 하나 | 페이지마다 하나, 즉 언어별 또는 캠페인별 |
| 둘 다 설정된 경우 | 우선 적용 | 무시됨 |
_redirect에 엄격한 규칙이 있는 이유는 그 값이 POST와 함께 도착하기 때문입니다. 규칙이 없으면 누구나 내 폼 URL을 POST하는 링크에 넣고 방문자를 피싱 페이지로 보낼 수 있으며, 이것이 오픈 리디렉션입니다.
- 폼 설정에 Redirect after submit URL이 있으면 Ikiform은 그곳으로 303을 응답하고 더 보지 않습니다.
- 그렇지 않고 POST에 포트나 자격 증명 없이 허용 도메인에 있는 https URL인 _redirect 또는 _next 필드가 있으면 Ikiform이 그곳으로 리디렉션합니다.
- 그 밖에는 Ikiform이 호스팅 감사 페이지로 리디렉션하며, 허용 도메인의 https 페이지에서 온 POST라면 그 페이지로 돌아가는 링크가 있습니다.
폼
<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입니다.
<!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에는 내 사이트만 남겨 둘 수 있습니다.
폼마다 다른 페이지
대시보드 설정은 폼당 URL 하나입니다. 한 폼이 서로 다른 감사 페이지가 필요한 여러 페이지에 있다면 설정을 비워 두고 각 페이지에 고유한 _redirect를 주세요. 독일어 페이지는 방문자를 독일어 감사 페이지로 보냅니다.
<input type="hidden" name="_redirect" value="https://example.com/de/demo/danke" />리디렉션에 값 추가하기
_redirect의 쿼리 문자열은 유지되므로 방문자가 고른 것을 감사 페이지로 넘길 수 있습니다. 브라우저 검증 뒤, 폼이 인코딩되기 전에 실행되는 submit 리스너에서 값을 설정하세요.
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을 쓰세요. 새로고침 없는 제출 가이드에 오류와 로딩 상태를 포함한 전체 핸들러가 있습니다.
작동 확인하기
- 폼의 Allowed domains에 사이트 도메인을 추가하고, 개발하는 동안에는
localhost도 추가하세요. 비워 두면 어디서든 POST를 받습니다. - 실제 페이지에서 폼을 제출하세요. 주소 표시줄에 감사 페이지가 보이고, Network 패널에
303으로 응답한 POST가 보입니다. - 감사 페이지에서 새로고침을 누르세요. 브라우저가 다시 제출할지 묻지 않고, 대시보드에는 여전히 제출 하나만 있습니다.
_redirect를 허용되지 않은 도메인의 주소로 바꾸고 제출하세요. 오류 없이 대신 Ikiform의 호스팅 감사 페이지로 이동합니다.- 대시보드에서 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인 이유를 설명합니다.
질문
폼을 받는 서버가 그 페이지로 303 리디렉션을 응답합니다. Ikiform에서는 폼 설정의 Redirect after submit을 설정하거나, 폼의 허용 도메인 중 하나에 있는 https URL로 숨겨진 _redirect 입력을 추가하세요.
항상 우선하는 폼의 Redirect after submit 설정이 되어 있거나, URL이 규칙에 맞지 않기 때문입니다. https여야 하고, 허용 도메인이나 그 서브도메인에 있어야 하며, 포트, 사용자 이름, 비밀번호가 없어야 합니다. 허용 도메인이 없는 폼은 _redirect를 무시합니다.
네. 어떤 http 또는 https URL이든 받는 폼의 Redirect after submit 설정에 URL을 넣으세요. 대신 _redirect를 쓰면 그 사이트를 허용 도메인에 추가해야 하고, 그러면 그 사이트도 내 폼으로 POST할 수 있게 됩니다.
Ikiform의 리디렉션으로는 안 됩니다. URL을 주어진 그대로 쓰기 때문입니다. submit 리스너에서 _redirect URL에 개인정보가 아닌 값을 추가하거나, fetch 제출 뒤 직접 작성한 스크립트로 메시지를 보여 줄 수 있습니다.
막히는 단계가 있거나 내 상황에 맞는 가이드가 필요하다면 이메일을 보내세요: hello@ikiform.com.