본문 바로가기

비개발자의 개발 일지

현장 팀장에서 수출 ERP까지 — AI와 함께 시스템을 만든 기록

시리즈 보기
php

PHP POST 폼 기초 — form + view 완전 정리

by 왕진 2026. 7. 11.
반응형

 

 

Web Development · PHP

PHP POST 폼 기초 —
form + view 완전 정리

HTML <FORM>으로 데이터를 보내고 PHP $_POST로 받는 2파일 구조의 핵심
시작 오늘 분석할 코드

HTML 폼에서 입력한 데이터를 POST 방식으로 PHP 파일에 전달하는 가장 기본 패턴이다. form.html(입력)과 view.php(결과) 두 파일로 나뉜다.

form.html — 입력 화면
<HTML><HEAD> <TITLE>텍스트 송신 테스트</TITLE> <META http-equiv="Content-Type" content="text/html; charset=utf-8"> </HEAD> <BODY bgcolor="#FFFFFF" text="#000000"> <FONT size="4">텍스트 송신 테스트</FONT> <FORM name="form1" method="post" action="view.php"> 이름:<BR> <INPUT type="text" name="onamae"><BR> <INPUT type="submit" value="송신"> </FORM> </BODY></HTML>
view.php — 결과 화면
<HTML><HEAD><TITLE>PHP 테스트</TITLE></HEAD><BODY> <?php print $_POST["onamae"]." 님 안녕하세요!"; ?> </BODY></HTML>
실제 흐름 미리보기
form.html
입력폼
POST 전송
onamae=홍길동
view.php
결과 출력
결과: 홍길동 님 안녕하세요!
용어 용어 정리
<FORM>데이터를 묶어서 전송하는 HTML 컨테이너 태그
method전송 방식 — post(본문에 숨김) 또는 get(URL에 노출)
action데이터를 받아 처리할 목적지 파일 경로
name 속성PHP $_POST의 key — name="onamae"이면 $_POST["onamae"]로 접근
$_POSTPHP 슈퍼글로벌 — POST 수신 데이터 전체를 담은 배열
printPHP 출력 명령 — 인자 문자열을 HTML에 직접 삽입
type="submit"클릭 시 FORM 전체를 action 파일로 전송하는 버튼
슈퍼글로벌함수·클래스 어디서든 선언 없이 바로 쓸 수 있는 PHP 전역 변수

1 <FORM> 태그 — 데이터 전달 범위 설정
왜 FORM 태그가 필요한가?

웹에서 사용자 입력을 서버로 보내려면 무엇을(INPUT), 어디로(action), 어떤 방식으로(method) 보낼지를 묶어서 지정해야 한다. <FORM>이 바로 그 컨테이너 역할을 한다. FORM 태그 안의 모든 INPUT·TEXTAREA·SELECT가 한 묶음으로 전송된다.

<FORM name="form1" method="post" action="view.php"> ...여기 안의 INPUT 요소들이 한 묶음으로 전송됨... </FORM>
※ FORM 바깥의 INPUT은 전송되지 않는다. 모든 입력 요소는 반드시 <FORM> 안쪽에 있어야 한다.

2 method="post" vs method="get"
왜 POST 방식인가?

HTML FORM의 전송 방식은 두 가지다. 어느 것을 쓰느냐에 따라 데이터 이동 경로가 달라진다.

method="post"
HTTP 요청 본문(body)에 데이터 포함
URL에 데이터가 노출되지 않음
전송 크기 제한 사실상 없음
로그인, 회원가입, 폼 제출에 적합
PHP: $_POST["key"]
method="get"
URL 뒤 ?key=value 형태로 노출
브라우저 주소창에서 바로 확인 가능
URL 길이 제한(약 2,000자)
검색, 필터, URL 공유가 필요한 경우
PHP: $_GET["key"]
※ 이름(onamae)처럼 개인 식별 정보를 GET으로 보내면 URL에 그대로 노출되고, 서버 로그에도 남는다. 민감 데이터는 반드시 POST를 써야 한다.

3 action="view.php" — 목적지 지정
action이 없으면 어떻게 되는가?

action은 "이 데이터를 받아서 처리할 파일"을 지정한다. 생략하면 현재 파일 자신에게 전송된다.

action="view.php" → 같은 폴더의 view.php action="sub/view.php" → 하위 폴더 action="/process/view.php" → 루트 기준 절대경로 action="" 또는 생략 → 현재 파일 자신 (셀프 처리 폼)
※ 처리 파일(view.php)은 반드시 .php 확장자여야 PHP 코드가 실행된다. .html로 저장하면 PHP 코드가 그대로 텍스트로 출력된다.

 

반응형

 

4 name 속성 — PHP가 데이터를 찾는 열쇠
왜 INPUT에 name이 중요한가?

FORM 안의 각 INPUT은 name 속성이 key, 입력값이 value가 된다. PHP는 이 key로 데이터를 꺼낸다. name이 없으면 그 INPUT의 데이터는 전송 자체가 안 된다.

HTML: <INPUT type="text" name="onamae"> → 사용자 입력: "홍길동" ↓ POST 전송 PHP: $_POST["onamae"] = "홍길동" ↑ key (name 속성) ↑ value (입력값)
※ name을 빠뜨리면 그 INPUT 값은 절대 서버에 전달되지 않는다. PHP에서 접근하면 "Undefined index" 경고 발생.

5 $_POST — PHP에서 데이터 받기
$_POST는 무엇인가?

$_POST는 PHP의 슈퍼글로벌 변수다. POST로 전송된 모든 데이터를 key-value 배열로 담고 있다. 함수 안에서도 별도 선언 없이 바로 쓸 수 있다.

// form.html에서 "홍길동" 입력 후 전송 → view.php에서: $_POST = ["onamae" => "홍길동"]; // PHP 내부 상태 print $_POST["onamae"]; // 출력: 홍길동 print $_POST["onamae"] . " 님 안녕하세요!"; // 출력: 홍길동 님 안녕하세요!
.(점)은 PHP의 문자열 연결 연산자다. JavaScript의 +와 같은 역할을 한다.
view.php를 직접 URL로 열면?

form.html을 거치지 않고 브라우저에서 view.php를 직접 열면 $_POST가 비어 있다. $_POST["onamae"]에 접근 시 "Undefined index" 경고가 뜨고 빈 값이 출력된다. 실무에서는 isset()으로 존재 여부를 먼저 확인한다.

// 안전한 접근 패턴 if (isset($_POST["onamae"])) { print $_POST["onamae"] . " 님 안녕하세요!"; } else { print "폼을 통해 접근해 주세요."; }

6 POST 보안 기초 — htmlspecialchars()
왜 입력값을 그대로 출력하면 위험한가?

사용자가 입력한 내용을 그대로 print로 출력하면 XSS(Cross-Site Scripting) 취약점이 생긴다. 이름 입력란에 <script>alert('해킹')</script>를 입력하면 view.php에서 그대로 스크립트가 실행된다.

// 위험한 코드 (이 예제 방식 — 학습용) print $_POST["onamae"]; // 안전한 코드 (실무 표준) print htmlspecialchars($_POST["onamae"], ENT_QUOTES, 'UTF-8'); // ↑ <, >, ", & 를 HTML 엔티티로 변환해 스크립트 실행 차단
원본 문자 변환 후 역할
< &lt; HTML 태그 시작 문자 무력화
> &gt; HTML 태그 종료 문자 무력화
" &quot; 속성값 탈출(escape) 방지
& &amp; 엔티티 이중 변환 방지
※ 이 예제는 PHP 학습용이라 생략했다. 실무에서는 외부 입력을 화면에 출력할 때 반드시 htmlspecialchars()를 적용하는 것이 철칙이다.

7 구식 HTML 태그 설명
FONT, bgcolor, text 속성이 남아 있는 이유

이 코드에는 HTML4 시대 표현용 태그가 섞여 있다. HTML5에서는 CSS로 처리하지만, 예전 교재나 레거시 코드에서 자주 보인다.

구식 코드 의미 현대 HTML5/CSS 대안
<FONT size="4"> 글자 크기 4 지정 style="font-size: 18px;"
<BODY bgcolor="#FFFFFF"> 배경색 흰색 body { background: #fff; }
<BODY text="#000000"> 글자색 검정 body { color: #000; }
태그 대문자 표기 HTML4 스타일 (관례) HTML5에서는 소문자 권장
이 예제는 학습용으로 HTML4 코드를 그대로 사용한다. 실제 프로젝트에서는 HTML5 방식으로 작성하는 것이 표준이다.

8 데이터 흐름 전체 순서
브라우저 → 서버 → 브라우저 여정
1
사용자가 form.html 열기브라우저가 HTML 렌더링 → 텍스트박스 + 송신 버튼 표시
2
이름 입력 후 "송신" 클릭FORM 데이터(onamae=홍길동)가 POST 방식으로 패키징됨
3
HTTP POST 요청 발송action="view.php"로 HTTP 요청 전송 — URL에 데이터 미노출, 본문에 포함
4
웹서버가 view.php 실행PHP 엔진이 요청 본문을 파싱 → $_POST["onamae"] = "홍길동" 세팅
5
print로 HTML 출력"홍길동 님 안녕하세요!"가 HTML로 조립되어 브라우저로 응답
6
브라우저가 결과 화면 렌더링사용자 눈에는 자연스럽게 결과 페이지가 열림

9 자주 하는 실수
실수 증상 해결
INPUT에 name 속성 누락 $_POST에 key 없어 Undefined index 경고 모든 INPUT에 name 속성 필수
action 파일명 오타 404 Not Found 또는 빈 화면 파일명·확장자 정확히 입력
method="get"으로 보내고 $_POST 사용 빈 값 반환 GET이면 $_GET, POST이면 $_POST
PHP 파일을 직접 URL로 열기 $_POST 비어 있어 오류 반드시 form.html을 통해 접근
PHP 코드 파일을 .html로 저장 PHP 코드가 텍스트로 그대로 출력 PHP 포함 파일은 .php 확장자 필수
htmlspecialchars() 미적용 후 출력 XSS 공격 취약 — 스크립트 실행 가능 print 전에 htmlspecialchars() 감싸기

실무 체크리스트 — 폼 처리 파일(view.php) 점검 4가지
  • isset()으로 $_POST 존재 확인 후 접근
  • htmlspecialchars()로 출력 시 XSS 차단
  • method="post" 확인 — 민감 정보는 GET 금지
  • action 파일은 반드시 .php 확장자

핵심 한 줄 요약

<FORM method="post" action="파일">안의 INPUT을 묶어 POST로 지정 파일에 전송
name="onamae"PHP $_POST의 key — 없으면 데이터 전달 안 됨
$_POST["onamae"]수신된 onamae 값 — 슈퍼글로벌이라 선언 없이 바로 사용
문자열 연결 .(점)PHP에서 문자열 이어 붙이기 — JS의 + 와 동일 역할
htmlspecialchars()외부 입력 출력 시 XSS 방어 — 실무 필수 패턴

Tags

#PHP #FORM태그 #POST방식 #action속성 #INPUT텍스트 #name속성 #$_POST #print #htmlspecialchars #XSS방어 #폼전송 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
PHP, FORM태그, POST방식, action속성, INPUT텍스트, name속성, $_POST, print, htmlspecialchars, XSS방어, 폼전송, 웹개발, 티스토리
반응형

댓글