반응형
Web Development · PHP Cookie
PHP 쿠키 — setcookie()와 $_COOKIE 완전 정리
브라우저에 저장되는 쿠키의 생성·읽기·유효기간 원리, 새로고침으로 방문횟수 세는 실습 코드 완전 분석
시작 오늘 분석할 코드
쿠키는 서버가 브라우저에 저장 지시하는 작은 데이터다. 브라우저는 이후 같은 서버 요청 때마다 쿠키를 자동으로 함께 전송한다. 이 예제는 쿠키에 방문 횟수를 저장하고, 10초 이내 새로고침 시 카운트가 올라가는 동작을 구현한다.
<?php $count = 1; if(isset($_COOKIE["count"])){ $count = $_COOKIE["count"]; $count ++; } setcookie("count", $count, time() + 10); // 쿠키의 제한시간을 설정하는 함수! ?> <BODY> <?php if($count == 1){ print "첫 방문입니다."; print "10초 이내에 새로고침 하면 카운트가 올라갑니다."; }else{ print "당신의 방문은 " . $count . " 번째입니다."; print "10초 이내에 새로고침을 하면 카운트가 올라갑니다."; } ?>
실제 출력 미리보기
첫 접속 시
쿠키 테스트첫 방문입니다.
쿠키 정보가 없습니다.
페이지를 새로고침 하세요.
→
10초 내
새로고침
10초 내
새로고침
2번째 접속
쿠키 테스트당신의 방문은 2 번째입니다.
10초 이내에 새로고침을 하면
카운트가 올라갑니다.
용어 핵심 용어 정리
쿠키(Cookie)서버가 브라우저에 저장 지시하는 이름=값 데이터. 지정한 만료 시간까지 보관됨
setcookie()쿠키를 생성·갱신·삭제하는 PHP 함수. Set-Cookie 헤더를 전송
$_COOKIE브라우저가 전송한 쿠키를 담는 PHP 슈퍼글로벌 배열. 이번 요청의 이전 쿠키를 담음
time()현재 Unix 타임스탬프(1970-01-01 00:00:00 UTC 기준 초). time()+10 = 10초 후
만료 시간(expire)setcookie 3번째 인수. 이 시간 이후 브라우저가 쿠키를 자동 삭제
isset($_COOKIE)첫 방문 시 해당 쿠키가 없어서 키가 없음. 존재 확인 필수
Set-Cookie 헤더서버가 브라우저에 쿠키 저장을 지시하는 HTTP 응답 헤더
클라이언트 저장쿠키는 서버가 아닌 브라우저(클라이언트)에 저장됨 — 세션과의 핵심 차이
1 쿠키가 동작하는 메커니즘
서버와 브라우저가 쿠키를 주고받는 전체 흐름
쿠키는 한 번의 요청-응답으로 끝나지 않는다. 서버가 응답 헤더로 저장 지시 → 브라우저가 로컬에 보관 → 다음 요청 시 자동으로 쿠키 전송의 반복이다.
1
첫 접속 — 브라우저에 쿠키 없음 $_COOKIE["count"]가 없어 isset()이 false → $count = 1
2
setcookie("count", 1, time()+10) 실행 HTTP 응답 헤더에 "Set-Cookie: count=1; Expires=+10s" 포함. 브라우저가 쿠키 저장
3
10초 내 새로고침 — 브라우저가 쿠키 전송 HTTP 요청 헤더에 "Cookie: count=1" 자동 포함. $_COOKIE["count"] = "1"
4
isset() 통과 → $count++ → setcookie 갱신 $count = 2. setcookie로 만료를 다시 10초 연장. "2번째 방문" 출력
첫 요청
쿠키 없음
쿠키 없음
→
setcookie()
Set-Cookie 헤더
Set-Cookie 헤더
→
브라우저
쿠키 저장
쿠키 저장
→
다음 요청
Cookie 헤더 전송
Cookie 헤더 전송
→
$_COOKIE
값 읽기
값 읽기
2 setcookie() 함수 완전 분석
인수 구성과 각각의 의미
setcookie(name, value, expire, path, domain, secure, httponly)의 7개 인수 중 필수는 name 하나다. 나머지는 생략하면 기본값이 적용된다.
setcookie("count", $count, time() + 10); // 인수 1: 쿠키 이름 "count" // 인수 2: 쿠키 값 $count // 인수 3: 만료 시각 — time()+10 = 현재 + 10초 // 더 많은 인수 예시: setcookie("user", "hong", time() + 3600); // 1시간 유지 setcookie("user", "hong", time() + 86400); // 1일 유지 setcookie("user", "hong", time() + 2592000); // 30일 유지 setcookie("user", "", time() - 1); // 쿠키 삭제 (과거 시간)
⚠ setcookie()도 session_start()처럼 HTTP 헤더를 조작하므로 HTML 출력 이전에 호출해야 한다. 순서를 지키지 않으면 "Cannot modify header information" 오류.
3 $_COOKIE와 setcookie의 타이밍 차이
같은 요청에서 setcookie로 설정한 값을 $_COOKIE로 읽을 수 없다
이 코드의 핵심 함정이다. setcookie("count", $count, ...)를 실행해도 $_COOKIE["count"]는 이 요청에서는 변경되지 않는다. $_COOKIE는 이번 요청이 시작될 때 브라우저가 보내준 값을 담고 있고, setcookie는 다음 요청부터 $_COOKIE에 반영된다.
// 이 코드가 동작하는 이유: $count = 1; // ① 기본값 설정 if(isset($_COOKIE["count"])){ // ② 이전 방문 쿠키 있으면 $count = $_COOKIE["count"]; // ③ 쿠키 값 읽기 $count++; // ④ 증가 } setcookie("count", $count, time()+10); // ⑤ 새 값으로 쿠키 갱신 (다음 요청에 반영) // 화면에는 $count (PHP 변수) 값을 사용 — $_COOKIE가 아니라 if($count == 1) { ... } else { ... } // ⑥ $count로 분기
※ $_COOKIE가 아닌 PHP 변수 $count로 화면 출력하는 이유가 이것이다. $_COOKIE는 이번 요청에서 이미 읽었고, setcookie로 바꾼 값은 다음 요청 때야 $_COOKIE에 들어온다.
반응형
4 time()과 Unix 타임스탬프
쿠키 만료 시간을 정하는 방법
time()은 현재 시각을 Unix 타임스탬프(1970년 1월 1일 0시 0분 0초 UTC부터 흐른 초수)로 반환한다. 쿠키 만료 시간도 같은 형식으로 지정한다. time() + 초수로 "현재로부터 N초 후 만료"를 간단히 표현한다.
time() // 예: 1750000000 (현재 Unix 타임스탬프) time() + 10 // 10초 후 time() + 3600 // 1시간 후 (60×60) time() + 86400 // 1일 후 (60×60×24) time() + 2592000 // 30일 후 (60×60×24×30) time() - 1 // 과거 = 즉시 만료 = 쿠키 삭제
만료 시간 0 또는 생략 시
- expire를 0으로 지정하거나 생략하면 세션 쿠키가 됨
- 세션 쿠키는 브라우저 탭을 닫으면 삭제됨
- 브라우저 재시작 시에도 사라짐 (배열 내 PHPSESSID가 대표 예)
5 쿠키 vs 세션 — 저장 위치의 차이
같은 목적, 다른 저장 방식
쿠키와 세션은 모두 HTTP 무상태를 극복하고 데이터를 유지하는 방법이다. 하지만 저장 위치와 보안 수준이 다르다.
쿠키(Cookie)
클라이언트(브라우저)에 저장
브라우저 개발자도구로 값 확인·수정 가능
만료 시간 지정으로 장기 보관 가능
서버 재시작해도 유지
적합: 로그인 상태 유지, 설정 기억
브라우저 개발자도구로 값 확인·수정 가능
만료 시간 지정으로 장기 보관 가능
서버 재시작해도 유지
적합: 로그인 상태 유지, 설정 기억
세션(Session)
서버에 저장 (클라이언트에는 세션 ID만)
값이 클라이언트에 노출 안 됨
브라우저 종료 시 기본 만료
서버 재시작 시 삭제 (설정 따라 다름)
적합: 로그인 정보, 민감 데이터
값이 클라이언트에 노출 안 됨
브라우저 종료 시 기본 만료
서버 재시작 시 삭제 (설정 따라 다름)
적합: 로그인 정보, 민감 데이터
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| setcookie()를 HTML 출력 후 호출 | "Cannot modify header information — headers already sent" 오류 | setcookie()는 HTML 출력 이전, 파일 맨 위에서 호출 |
| setcookie 후 같은 요청에서 $_COOKIE로 읽기 | 변경 안 된 이전 값을 읽거나 Undefined index 발생 | setcookie로 설정한 값은 PHP 변수에 보관. 다음 요청에서 $_COOKIE로 읽힘 |
| 만료 시간에 time() 없이 숫자만 입력 | setcookie("n", "v", 10) — 1970년 기준 10초 후 만료 = 이미 과거 = 즉시 삭제 | 반드시 time() + 초수 형태로 절대 시간 지정 |
| 쿠키에 배열·객체를 직접 저장 시도 | "Array" 또는 "Object" 문자열이 저장됨 | 쿠키 값은 문자열만 저장 가능. json_encode()로 직렬화 후 저장 |
| isset($_COOKIE) 없이 직접 접근 | 첫 방문(쿠키 없음) 시 "Undefined index" 경고 | if(isset($_COOKIE["count"]))로 존재 확인 후 접근 |
핵심 한 줄 요약
setcookie(name, val, expire)쿠키 저장 지시. HTML 이전에 호출. expire = time()+초수
$_COOKIE브라우저가 보내온 이전 쿠키. setcookie 직후 바로 읽히지 않음
time() + N현재부터 N초 후 만료. time()-1은 즉시 삭제
쿠키 vs 세션쿠키=클라이언트 저장(장기 가능), 세션=서버 저장(보안)
Tags
#PHP #cookie #쿠키 #setcookie #$_COOKIE #방문횟수 #time함수 #유효기간 #클라이언트저장 #웹개발
▼ 티스토리 태그 입력란 복사용
PHP, cookie, 쿠키, setcookie, $_COOKIE, 방문횟수, time함수, 유효기간, 클라이언트저장, 웹개발
반응형
'php' 카테고리의 다른 글
| PHP select 드롭다운 — option 선택값 처리 완전 정리 (0) | 2026.07.07 |
|---|---|
| PHP 세션 — session_start()와 $_SESSION 완전 정리 (0) | 2026.07.07 |
| PHP 세션 확인폼 — form→confirm→view 3페이지 구성 완전 정리 (2) | 2026.07.07 |
| PHP 체크박스 배열 — name[] + implode() 완전 정리 (0) | 2026.07.07 |
| Canvas 원호 · 선 스타일 완전 정리 (1) | 2026.07.07 |
왕진 블로그

댓글