HOWTO · PHP

PHP에서 다음 페이지로 변수를 전달하는 방법

HTML 양식을 통한 GET 및 POST 사용, 세션 및 쿠키 사용과 같이 PHP를 사용하여 다음 페이지로 변수를 전달하는 방법에 대한 다양한 접근 방식.

이 페이지의 내용

일반 PHP 변수는 해당 요청을 처리하는 동안에만 존재합니다. 다른 페이지에서 값을 사용하려면 요청과 함께 보내거나 이후 요청을 위해 저장해야 합니다. 양식은 이름이 지정된 필드를 action에 설정된 URL로 보내며, 다음 페이지의 PHP는 해당 요청 배열에서 제출된 필드를 읽습니다.

브라우저 양식이 이름이 지정된 값을 GET 또는 POST 방식으로 nextPage.php에 보내고, PHP가 같은 이름을 $_GET 또는 $_POST에서 읽는 흐름도.

양식 필드 이름은 PHP가 값을 가져올 때 사용하는 키입니다. GET은 값을 URL에 넣고, POST는 요청 본문에 보냅니다.

PHP는 페이지 요청 간에 데이터를 어떻게 전달하는가

페이지를 불러올 때마다 별도의 HTTP 요청이 발생합니다. 첫 번째 요청을 처리하는 동안 만든 $name 같은 변수는 PHP가 다음 요청을 처리할 때 자동으로 사용할 수 없습니다. 값이 얼마나 오래 필요하고 브라우저를 통해 전달해야 하는지에 따라 전송 또는 저장 방식을 선택하세요.

다음 페이지에 제출된 양식 데이터가 필요하다면 GET 또는 POST를 사용하세요. 여러 요청에 걸쳐 사용할 서버 측 상태에는 세션을 사용하세요. 쿠키는 브라우저에 작은 값을 저장하고 이후 요청에서 그 값을 다시 보냅니다. 이런 방식은 데이터를 전달하거나 유지할 뿐, 신뢰할 수 없는 입력을 안전하게 만들지는 않습니다. 용도에 맞게 데이터를 검증하고 표시할 문맥에 맞춰 이스케이프하세요.

GET 또는 POST 양식으로 데이터 전달하기

양식의 action을 값을 받을 페이지로 설정하고 각 필드에 일관된 name을 지정하세요. method에 따라 필드가 전달되는 요청 배열이 달라집니다. 다음 양식은 POST를 사용해 이름을 nextPage.php로 제출합니다. 코드 예시의 화면 레이블과 출력 문자열은 바이트 단위로 보존되므로 영어로 표시됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

<form action="nextPage.php" method="post">
  <label>Name <input name="name" type="text"></label>
  <button type="submit">Continue</button>
</form>

nextPage.php에서 값을 사용하기 전에 예상한 키가 있는지 확인하세요. 값을 HTML에 넣을 때는 이스케이프하세요:

<?php
$name = $_POST['name'] ?? null;
if ($name !== null) {
    echo 'Hello, ' . htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>

제공된 패킷에서는 이 수신 페이지 예제를 실행하지 않았습니다. 웹 페이지로 제공하면 요청에 name이 있을 때만 인사말을 출력합니다. 필드 이름 name은 $_POST['name'] 키와 일치해야 합니다. 널 병합 연산자를 사용하면 해당 필드가 제출되지 않은 요청에서도 정의되지 않은 배열 키를 읽지 않고 처리할 수 있습니다.

GET 요청에서는 쿼리 필드 이름과 nextPage.php가 읽는 키를 일치시키는 링크나 양식을 사용하세요. 다음 링크는 name 필드에 Alice 값을 보냅니다. 링크 예제의 표시 문자열은 바이트 단위로 보존되므로 영어로 유지됩니다.

<a href="nextPage.php?name=Alice">Continue as Alice</a>

nextPage.php에서 해당 필드를 $_GET['name']으로 읽고, 값을 표시하기 전에 필드가 있는지 확인하세요:

<?php
$name = $_GET['name'] ?? null;
if ($name !== null) {
    echo 'Hello, ' . htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>

이 수신 페이지 예제는 들어오는 웹 요청에 의존하므로 제공된 패킷에서 실행되지 않았습니다. 링크의 쿼리 매개변수 name은 수신 측의 $_GET['name'] 키와 일치합니다. GET 양식을 사용하려면 메서드를 get으로 설정하고 각 필드에 수신 측과 같은 name을 지정하세요. 임의의 텍스트를 URL에 이어 붙이는 대신 동적 값을 인코딩하세요. GET 데이터는 주소 표시줄에 나타나며 브라우저 기록, 북마크, 서버 로그 또는 리퍼러 데이터에 남을 수 있습니다. 검색어처럼 공유 가능한 비민감 정보에 사용하고 비밀 정보는 넣지 마세요.

POST는 제출된 필드를 요청 본문에 담으므로 URL에 표시되지 않지만 데이터를 암호화하지는 않습니다. 전송을 보호하려면 HTTPS를 사용하고, POST가 권한 확인이나 입력 검증을 대신한다고 여기지 마세요. 값의 출처가 중요하다면 $_REQUEST 사용을 피하세요. 설정에 따라 GET, POST, 쿠키 데이터가 합쳐질 수 있어 애플리케이션이 실제로 어느 값을 사용하는지 불분명해질 수 있습니다.

PHP 세션 또는 쿠키로 데이터 공유하기

세션은 값을 서버에 보관하고 세션 식별자를 사용해 브라우저와 연결합니다. 세션 데이터를 읽거나 쓰는 모든 페이지에서 페이지 출력을 보내기 전에 세션을 시작하세요. 두 요청에서 같은 키를 사용해야 합니다. 첫 번째 페이지에서 값을 저장합니다. 코드 블록의 문자열은 바이트 단위로 보존되므로 영어로 표시됩니다.

이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.

<?php
session_start();
$_SESSION['animal'] = 'Dog';
?>

값을 받는 페이지에서도 출력을 보내기 전에 세션을 시작하고, 읽기 전에 같은 키가 있는지 확인하세요:

<?php
session_start();
if (isset($_SESSION['animal'])) {
    echo htmlspecialchars($_SESSION['animal'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>

세션은 여러 페이지로 이어지는 절차나 로그인한 사용자의 서버 측 데이터처럼 요청이 바뀌어도 유지해야 하는 상태에 적합합니다. HTTPS와 적절한 쿠키 설정으로 세션 식별자를 보호하고, 각 페이지에서 접근 권한을 계속 확인하세요.

쿠키를 만들려면 출력을 보내기 전에 setcookie()를 호출하세요. 브라우저가 쿠키를 받은 뒤 이후 요청에서 다시 보낼 수 있으며, PHP는 받은 값을 $_COOKIE로 제공합니다. 코드 블록의 값은 바이트 단위로 보존되므로 영어로 표시됩니다:

<?php
setcookie('animal', 'Dog', [
    'expires' => time() + 3600,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
?>

새 값은 보통 현재 요청에서 즉시가 아니라 다음 요청에서 $_COOKIE에 나타납니다. 브라우저 쿠키를 설정하려고 $_COOKIE에 값을 대입하지 마세요. 그렇게 하면 현재 PHP 배열만 바뀝니다. 쿠키는 클라이언트 측에 저장되므로 사용자가 삭제하거나 변경할 수 있습니다. 따라서 권한이나 민감한 상태를 쿠키 내용에 의존하지 마세요. 브라우저에 필요한 값만 저장하고 돌아온 값은 검증하세요.

그 이후 요청에서 일치하는 쿠키 키가 있는지 확인하고 읽으세요:

<?php
if (isset($_COOKIE['animal'])) {
    echo htmlspecialchars($_COOKIE['animal'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>

방식을 선택하고 제출된 값을 안전하게 처리하기

공유할 수 있는 URL에 포함할 데이터에는 GET을, 데이터를 변경하거나 처리하는 양식 제출에는 POST를 사용하세요. 여러 요청에 걸쳐 필요한 서버 측 값에는 세션을, 브라우저에 보관한 작은 값을 나중에 다시 보내야 할 때는 쿠키를 사용하세요. GET과 POST 중 어느 쪽도 본질적으로 안전하지 않습니다. HTTPS는 전송 중인 데이터를 보호하고, 검증과 권한 확인은 애플리케이션의 동작을 보호합니다. 세션 값은 서버에 보관되지만 세션 식별자는 여전히 보호해야 합니다. 쿠키는 사용자가 통제합니다.

문제를 해결할 때는 양식의 method와 각 입력의 name이 수신 페이지의 $_GET 또는 $_POST 키와 일치하는지 비교하세요. 양식의 action이 예상한 페이지를 가리키는지 확인하고, 키를 읽기 전에 누락 여부를 점검하세요. 세션을 사용한다면 두 페이지 모두 출력을 보내기 전에 세션을 시작하고 같은 키를 사용하는지 확인하세요. 쿠키는 출력을 보내기 전에 설정하고 이후 요청에서 확인하세요. 값의 형식을 검사했더라도 HTML 출력에는 htmlspecialchars()처럼 출력 문맥에 맞는 이스케이프를 적용하세요.