본문 바로가기

비개발자의 개발 일지

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

시리즈 보기
php

PHP 쿠키 — setcookie()와 $_COOKIE 완전 정리

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

 

 

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초 내
새로고침
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 헤더
브라우저
쿠키 저장
다음 요청
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함수, 유효기간, 클라이언트저장, 웹개발
반응형

댓글