올바른 이해와 사용 방법
$_SERVER['HTTP_REFERER']은 현재 페이지로 이동(navigated)하게 만든 이전 페이지의 URL을 반환합니다.
알아두세요!
현재 페이지로 이동(navigated)하게 만든 이전 페이지의 URL을 참조 URL(Referrer URL 또는 HTTP Referer)이라고 합니다.
$_SERVER['HTTP_REFERER']은 어떤 경로(링크, 검색 엔진 등)를 통해 현재 페이지로 이동했는지 확인할 때 주로 사용됩니다.
기본 예제
// 참조 URL 가져오기
if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] !== '') { // 값이 존재하면
echo $_SERVER['HTTP_REFERER']; // 참조 URL이 문자열로 출력됩니다.
} else { // 값이 존재하지 않으면
echo '참조 URL을 가져올 수 없습니다.';
}
구문
$_SERVER['HTTP_REFERER']
슈퍼글로벌 변수인 $_SERVER는 현재 실행 중인 PHP 스크립트와 관련된 서버 및 실행 환경에 대한 정보가 키와 값으로 구성된 연관 배열입니다. 이 연관 배열의 'HTTP_REFERER' 키를 이용하면 HTTP 요청의 Referer 헤더 값을 문자열로 가져올 수 있습니다.
반환 값
- 현재 페이지로 이동하게 만든 이전 페이지의 URL을 문자열(string)로 반환합니다.
- 참조 URL 정보가 없는 경우
$_SERVER['HTTP_REFERER']키가 존재하지 않거나 빈 문자열('')을 반환합니다.
참조 URL 정보가 없는 경우
다음과 같이 현재 페이지로 이동하게 만든 이전 페이지의 URL 정보가 없는 경우에는 $_SERVER['HTTP_REFERER'] 키가 존재하지 않거나 값이 빈 문자열('')입니다.
직접 URL 입력 또는 북마크로 접속한 경우
사용자
↓
주소창에 https://example.com 직접 입력
↓
현재 페이지
이 경우 브라우저가 HTTP 요청의 Referer 헤더 값을 전달하지 않기 때문에
$_SERVER['HTTP_REFERER'] 키가 존재하지 않습니다.
/* 존재하지 않는 키에 직접 접근 */
var_dump($_SERVER['HTTP_REFERER']);
// 출력:
// PHP 8.0 이전 - Notice: Undefined index: HTTP_REFERER in ...
// PHP 8.0부터 - Warning: Undefined array key "HTTP_REFERER" in ...
// NULL
rel="noreferrer"가 적용된 링크를 통해 이동한 경우
<a href="https://example.com" rel="noreferrer" target="_blank">링크로 이동하기</a>
rel="noreferrer"가 적용된 링크를 클릭하여 이동하는 경우, 브라우저는 HTTP 요청의 Referer 헤더 값을 전달하지 않기 때문에
$_SERVER['HTTP_REFERER'] 키가 존재하지 않습니다.
/* rel="noreferrer"가 적용된 링크를 통해 이동한 경우 */
var_dump($_SERVER['HTTP_REFERER']);
// 출력:
// PHP 8.0 이전 - Notice: Undefined index: HTTP_REFERER in ...
// PHP 8.0부터 - Warning: Undefined array key "HTTP_REFERER" in ...
// NULL
참조 URL 정보는 있지만 값이 빈 문자열('')인 경우
일부 서버 환경이나 웹 서버 설정(예: 프락시 서버, 보안 모듈 설정)에 따라 Referer 헤더가 빈 문자열('')로 처리되는 경우가 있습니다.
그 밖의 경우
- 이전 문서(페이지)에서 HTTP 헤더 또는 HTML meta 요소로 Referrer Policy를 설정한 경우
(예:Referrer-Policy: no-referrer,<meta name="referrer" content="no-referrer">) - 브라우저의 보안 정책에 따라 URL 정보 전달이 제한되는 경우
(예: 보안 수준이 낮아지는 프로토콜 변경 등)
주의할 점
$_SERVER['HTTP_REFERER']를 사용할 때는 몇 가지 주의할 점이 있습니다.
브라우저의 방문 기록(Session History) 아님
브라우저는 사용자가 현재 창이나 탭에서 방문한 페이지를 방문 기록(Session History)으로 관리합니다. 사용자가 새로운 페이지로 이동하거나 브라우저의 "뒤로 가기" 또는 "앞으로 가기" 기능을 사용할 수 있는 것도 이 방문 기록을 기반으로 동작합니다.
그러나 $_SERVER['HTTP_REFERER']은 이 방문 기록(Session History)을 가져오는 기능이 아닙니다.
브라우저가 관리하는 전체 방문 기록이 아니라, 현재 페이지로 이동하게 만든 이전 문페이지의 URL 정보, 즉 브라우저가 HTTP 요청의 Referer 헤더로 전달한 이전 페이지의 URL 정보를 제공합니다.
예를 들어, 사용자가 현재 창이나 탭에서 여러 페이지를 방문한 후 주소창에 URL을 직접 입력하거나 북마크를 통해 현재 페이지로 이동한 경우, 브라우저 방문 기록에는 이전에 방문한 페이지가 존재할 수 있습니다. 다음과 같은 경우를 생각해 볼 수 있습니다.
페이지 A 방문
↓
페이지 B 방문
↓
페이지 C 방문
↓
주소창에 페이지 D URL을 사용자가 직접 입력
↓
페이지 D 방문
이 경우 브라우저 방문 기록(Session History)에는 페이지 C가 존재할 수 있지만, 페이지 D로 이동하게 만든 이전 페이지는 존재하지 않습니다.
따라서 $_SERVER['HTTP_REFERER']은 페이지 C의 URL을 반환하지 않으며, $_SERVER['HTTP_REFERER'] 키 자체가 존재하지 않습니다.
$_SERVER['HTTP_REFERER']로 가져오는 URL 정보는 브라우저의 방문 기록(Session History)에 저장된 이전 방문 기록과 다를 수 있다는 것을 기억하세요.
사용 전 참조 URL 정보 존재 여부 확인
$_SERVER['HTTP_REFERER']는 항상 존재하는 값이 아닙니다.
브라우저가 HTTP 요청의 Referer 헤더 값을 전달하지 않는 경우에는 해당 키가 존재하지 않거나 빈 문자열('')일 수 있습니다.
따라서 $_SERVER['HTTP_REFERER']에 직접 접근하기 전에 isset() 함수와 빈 문자열 여부를 함께 확인하는 것이 안전합니다.
/* $_SERVER['HTTP_REFERER'] 키가 존재(isset())하는지와 빈 문자열('')인지 여부를 함께 체크합니다. */
if (isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] !== '') {
echo $_SERVER['HTTP_REFERER']; // 참조 URL이 문자열로 출력됩니다.
} else {
echo '참조 URL을 가져올 수 없습니다.';
}
코드 부연설명
isset() 함수는 변수가 존재하지만 그 값이 null이 아니면 true를 반환합니다. 빈 문자열('')도 null이 아니므로 true를 반환합니다. PHP isset() 함수와 empty() 함수 – 개념 정리 및 사용법과 차이점을 참고하세요.