반응형
Web Development · PHP Session
PHP 세션 — session_start()와 $_SESSION 완전 정리
서버 측 저장소로 방문 횟수를 기억하는 원리, 쿠키와의 차이, 세션 ID가 오가는 메커니즘까지
시작 오늘 분석할 코드
세션은 서버가 방문자별로 데이터를 저장하는 방식이다. 브라우저가 아닌 서버에 저장되고, 클라이언트에는 세션 ID만 쿠키로 전달된다. 쿠키와 달리 민감한 데이터를 안전하게 유지할 수 있다.
<?php session_start(); $count = 1; if(isset($_SESSION["count"])){ $count = $_SESSION["count"]; $count ++; } $_SESSION["count"] = $count; ?> <BODY> <?php if($count == 1){ print "처음 방문입니다."; print "세션 변수에 데이터가 없습니다."; }else{ print "당신의 방문은 " . $count . "회째입니다."; } ?>
실제 출력 미리보기
첫 접속
세션 변수 테스트처음 방문입니다.
세션 변수에 데이터가 없습니다.
페이지를 새로고침 하세요.
→
새로고침
새로고침
2번째 접속
세션 변수 테스트당신의 방문은 2회째입니다.
→
계속 새로고침
계속 새로고침
5번째 접속
세션 변수 테스트당신의 방문은 5회째입니다.
용어 핵심 용어 정리
session_start()세션 시작 선언. 세션 파일 생성 또는 기존 세션 재연결. HTML 이전에 반드시 호출
$_SESSION서버 측에 저장된 세션 데이터를 담는 PHP 슈퍼글로벌 배열. 읽기·쓰기 모두 가능
PHPSESSID세션 식별 쿠키. 서버가 브라우저에 부여하는 고유 토큰. 세션 데이터 자체는 서버에 있음
세션 파일서버의 /tmp 등에 sess_PHPSESSID 형태로 저장되는 파일. $_SESSION 내용이 직렬화됨
세션 만료PHP 기본 24분(1440초) 비활성 후 자동 삭제. 브라우저 종료 시 PHPSESSID 쿠키 사라짐
session_destroy()서버의 세션 데이터 전체 삭제. 로그아웃 처리에 사용
isset($_SESSION)세션 키 존재 여부 확인. 처음 접속 시 $_SESSION["count"]가 없어서 필수
세션 고정 공격세션 ID를 탈취·고정해 다른 사용자로 위장. session_regenerate_id()로 로그인 후 ID 재발급
1 세션의 동작 메커니즘
PHPSESSID 쿠키가 서버 저장소의 열쇠 역할을 하는 이유
세션이 "서버에 저장된다"는 뜻은, $_SESSION["count"] = 5를 실행하면 이 값이 서버 파일시스템(또는 DB)에 기록된다는 뜻이다. 브라우저에는 이 파일에 접근할 수 있는 열쇠(PHPSESSID)만 쿠키로 전달된다.
1
첫 접속 — session_start() 실행 PHP가 새 세션 ID(예: "abc123...")를 생성. /tmp/sess_abc123 파일 생성. 응답 헤더에 Set-Cookie: PHPSESSID=abc123 전송
2
$_SESSION["count"] = 1 할당 요청 처리 후 PHP가 $_SESSION 내용을 sess_abc123 파일에 직렬화해서 저장
3
새로고침 — 브라우저가 PHPSESSID 쿠키 전송 요청 헤더에 "Cookie: PHPSESSID=abc123" 포함. PHP가 같은 세션 파일 열어 $_SESSION 복원
4
isset($_SESSION["count"]) 통과 → count 증가 → 파일 갱신 $count = 2. $_SESSION["count"] = 2로 세션 파일 업데이트
첫 요청
세션 없음
세션 없음
→
session_start()
ID 발급+파일생성
ID 발급+파일생성
→
PHPSESSID
쿠키로 전달
쿠키로 전달
→
다음 요청
ID로 파일 조회
ID로 파일 조회
→
$_SESSION
값 읽기/쓰기
값 읽기/쓰기
2 쿠키와의 코드 비교 — 거의 같지만 핵심이 다르다
setcookie/$_COOKIE 패턴 vs session_start/$_SESSION 패턴
방문 횟수 세기라는 같은 목적의 코드를 쿠키와 세션으로 구현하면 구조가 거의 동일하다. 차이는 저장 함수와 읽기 방식뿐이다.
쿠키 방식
setcookie("count", $count, time()+10)$_COOKIE["count"]브라우저 로컬 저장
만료 시간 명시 필요
값이 브라우저에 노출됨
세션 방식
session_start()$_SESSION["count"] = $count$_SESSION["count"]서버 저장, ID만 쿠키로
만료 시간 자동 관리
값이 클라이언트에 미노출
※ 쿠키의 큰 차이는 만료 제어다. 이 세션 예제는 만료 시간을 지정하지 않아서 브라우저를 닫으면 카운트가 초기화된다. 쿠키 예제는 time()+10으로 10초를 지정했다.
3 $_SESSION 쓰기와 읽기
쿠키와 달리 즉시 반영된다
쿠키는 setcookie()로 저장해도 같은 요청에서 $_COOKIE로 바로 읽히지 않았다. 세션은 다르다. $_SESSION["key"] = value로 저장하면 같은 요청 내에서 즉시 $_SESSION["key"]로 읽을 수 있다. 왜냐면 $_SESSION은 서버 메모리의 배열이고, setcookie는 HTTP 헤더이기 때문이다.
// 세션 — 같은 요청에서 즉시 읽힘 (OK) session_start(); $_SESSION["user"] = "hong"; echo $_SESSION["user"]; // "hong" 즉시 출력됨 ✓ // 쿠키 — 같은 요청에서는 이전 값 (주의 필요) setcookie("user", "hong", time()+3600); echo $_COOKIE["user"]; // 이전 요청의 값 또는 Undefined ✗
반응형
4 세션 만료와 삭제
세션이 끝나는 세 가지 경우
세션 데이터는 영원히 유지되지 않는다. 다음 세 가지 상황에서 세션이 종료된다.
| 만료 상황 | 동작 | 관련 설정/함수 |
|---|---|---|
| 브라우저 탭/창 닫기 | PHPSESSID 세션 쿠키 삭제. 다음 접속 시 새 세션 ID 발급 | 기본 동작 (PHPSESSID는 세션 쿠키) |
| 일정 시간 비활성 | 서버 세션 파일 가비지 컬렉션으로 삭제 | php.ini: session.gc_maxlifetime (기본 1440초) |
| 명시적 삭제 | $_SESSION 초기화 + 서버 세션 파일 삭제 | $_SESSION = []; session_destroy(); |
// 로그아웃 시 세션 완전 삭제 패턴 session_start(); $_SESSION = []; // $_SESSION 배열 비우기 session_destroy(); // 서버 세션 파일 삭제 // PHPSESSID 쿠키도 삭제하려면: setcookie(session_name(), '', time()-1);
5 세션 변수 활용 범위
여러 페이지에서 같은 데이터를 공유하는 방법
세션의 진짜 강점은 같은 세션 ID를 가진 모든 페이지에서 데이터를 공유한다는 점이다. 로그인 정보를 세션에 한 번 저장하면, 다른 페이지들은 session_start() 호출만으로 그 정보에 접근할 수 있다.
// login.php — 로그인 성공 시 세션에 저장 session_start(); $_SESSION["user_id"] = 42; $_SESSION["username"] = "홍길동"; $_SESSION["is_admin"] = false; // board.php — 다른 페이지에서 꺼내 쓰기 session_start(); if(!isset($_SESSION["user_id"])){ header("Location: login.php"); // 미로그인 → 로그인 페이지로 exit(); } echo $_SESSION["username"] . "님 환영합니다";
※ 이 방문횟수 예제는 세션의 가장 단순한 사용이지만, 구조는 로그인 세션과 완전히 같다. session_start + $_SESSION 읽기/쓰기가 전부다.
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| session_start() 호출 빠뜨림 | $_SESSION이 항상 비어있어 카운트가 올라가지 않음 | 세션 사용하는 모든 파일 맨 위에 session_start() 추가 |
| session_start() 이후 HTML 출력 | "Cannot modify header information — headers already sent" 오류 | session_start()를 파일 최상단, 어떤 출력보다 앞에 배치 |
| isset($_SESSION) 없이 직접 접근 | 첫 방문 시 (세션 없음) "Undefined index" 경고 | if(isset($_SESSION["count"]))로 존재 확인 후 읽기 |
| session_destroy() 후 $_SESSION 접근 | 서버 파일은 삭제됐으나 PHP 변수 $_SESSION은 메모리에 남아 있어 혼란 | destroy 전에 $_SESSION = []로 배열 비운 후 session_destroy() 호출 |
| 여러 탭에서 같은 세션 카운트 공유되는 것을 의도치 않게 발생 | 탭 A에서 5회, 탭 B 열면 6회로 시작 (같은 브라우저 = 같은 세션 ID) | 탭별 독립 카운터가 필요하면 URL에 토큰 추가 등 다른 방식 사용 |
핵심 한 줄 요약
session_start()세션 선언. HTML 이전, 세션 쓰는 모든 파일에 필수
$_SESSION 즉시 반영배열 할당 즉시 같은 요청에서 읽힘 — 쿠키와 다른 점
PHPSESSID = 열쇠실제 데이터는 서버에, 브라우저에는 ID만 전달 → 보안 우위
세션 vs 쿠키세션=서버저장·보안, 쿠키=클라이언트저장·장기유지
Tags
#PHP #session #세션 #session_start #$_SESSION #방문횟수 #서버저장 #PHPSESSID #세션만료 #웹개발
▼ 티스토리 태그 입력란 복사용
PHP, session, 세션, session_start, $_SESSION, 방문횟수, 서버저장, PHPSESSID, 세션만료, 웹개발
반응형
'php' 카테고리의 다른 글
| PHP 라디오버튼 — 단일 선택값 처리 완전 정리 (0) | 2026.07.08 |
|---|---|
| PHP select 드롭다운 — option 선택값 처리 완전 정리 (0) | 2026.07.07 |
| PHP 쿠키 — setcookie()와 $_COOKIE 완전 정리 (0) | 2026.07.07 |
| PHP 세션 확인폼 — form→confirm→view 3페이지 구성 완전 정리 (2) | 2026.07.07 |
| PHP 체크박스 배열 — name[] + implode() 완전 정리 (0) | 2026.07.07 |
왕진 블로그

댓글