VCA

이메일을 받는 문의 폼 만들기

정적 사이트는 백엔드가 없는데 방문자가 보낸 건 누가 받나? $0 세 가지 방법과 봇에 도배당하지 않는 기본 방어.

게시일 수정일 검토일 약 2분 분량편집 방침#실전 가이드##프런트엔드

한 문장으로

문의 받기는 쉬워 보이지만 어려운 건 '정적 사이트엔 백엔드가 없다'는 점. 누가 받는지와 남용을 어떻게 막는지를 다룬다.

만들 결과물

실제로 메시지가 도착하는 문의 폼. 정적 사이트가 어떤 수신 방식을 쓰고 어떤 남용 방어를 넣어야 하는지 알게 된다.

폼이 그리 간단하지 않은 이유

입력칸을 만드는 건 쉽습니다. 어려운 건 '제출 버튼을 누른 뒤 그 메시지가 어디로 가는가'입니다. 정적 사이트는 화면뿐이고 백엔드가 없어서 제출을 스스로 처리할 수 없습니다. 그래서 핵심은 폼의 모양이 아니라 누가 받는가입니다.

$0로 받는 세 가지 방법

  1. 폼 서비스: 제출 대상을 제3자 서비스(대부분 무료 한도 있음)로 향하게 합니다. 받아서 내 받은편지함으로 전달해 줍니다. 가장 빠르고 백엔드 코드가 필요 없습니다.
  2. Cloudflare Pages Functions: 사이트 옆에 작은 백엔드 함수를 두어 제출을 받고 메일 발송이나 DB 저장을 합니다. 무료 한도 안, 제3자 의존 없음.
  3. mailto 링크: 가장 단순. 클릭하면 사용자의 메일 앱이 열립니다. 백엔드 불필요지만 경험이 나쁘고 스팸 처리되기 쉽습니다.

가장 빨리 출시하려는 초보자는 폼 서비스, 제어와 향후 DB를 원하면 Pages Functions.

반드시 넣어야 할 남용 방어

공개 폼은 봇의 표적이 됩니다. 최소한:

  • 필드 검증: 이메일 형식·필수·길이 상한—프런트에서 한 겹, 받는 쪽에서 또 한 겹(프런트 검증은 우회될 수 있음).
  • honeypot(숨김 필드): 사람에겐 안 보이고 봇만 채우는 숨김 필드. 채워져 있으면 버립니다.
  • 레이트 리밋: 같은 출처의 짧은 시간 내 횟수를 제한해 도배를 막습니다.
  • 수신 이메일을 프런트에 박지 않기: 백엔드/서비스 설정에 둡니다. 안 그러면 이메일을 크롤러에 공개하는 셈.

AI에게 이렇게 말하세요

수신 방식·필요한 필드·"honeypot + 검증 + 레이트 리밋을 넣어줘"를 분명히 전한 뒤 구현하게 하세요. '문의 폼 만들어줘'만 하면 받는 사람도 없고 남용 방어도 없는 프런트가 나오기 쉽습니다.

다음 단계

자주 묻는 질문

정적 사이트에서 정말 문의 폼을 만들 수 있나요?

가능합니다. 폼의 ‘화면’은 정적 사이트에도 둘 수 있습니다. 빠진 건 ‘제출을 누가 받는가’입니다. 제출 대상을 폼 서비스나 자체 Cloudflare Pages Functions로 향하게 하면 됩니다—표시는 정적 페이지, 수신은 서비스나 함수가 맡습니다.

프런트에서 검증했는데 왜 백엔드에서 또 검증하나요?

프런트 검증은 우회될 수 있기 때문입니다. 공격자는 당신의 페이지를 쓰지 않고 받는 쪽으로 임의 데이터를 바로 보낼 수 있습니다. 프런트 검증은 UX(즉각 피드백)용이고, 진짜 관문은 받는 쪽에서 다시 해야 합니다—‘클라이언트 입력을 신뢰하지 않는다’ 원칙.

참고 자료

  1. <form> — MDN Web DocsMozilla
  2. Cloudflare Pages FunctionsCloudflare