로그인했는데 다음 페이지 가니까 로그아웃?! PHP 세션으로 그런 문제 싹 해결하세요.
안녕하세요, PHP를 배우며 로그인 시스템까지 구현해본 분들이라면 한 번쯤 이런 경험 있으실 거예요. 로그인 성공했는데 다음 페이지에 가니까 로그인 정보가 사라져 버리는 문제! 저도 그랬어요. 이럴 때 꼭 알아야 할 개념이 바로 ‘세션(Session)’입니다. 세션은 사용자의 상태를 서버에 저장해두는 방식으로, 로그인 유지, 장바구니 기능, 관리자 권한 설정 등 다양한 상황에서 활용돼요. 이번 포스트에서는 PHP 세션의 시작부터 설정, 활용, 보안 관리까지 입문자도 이해할 수 있도록 단계별로 설명드릴게요. 글을 다 읽고 나면 “아, 세션이란 게 이런 거였구나!” 하고 고개 끄덕이실 겁니다!
세션(Session)이란?
세션은 사용자가 웹사이트에 접속한 뒤, 서버에서 그 사용자의 상태 정보를 유지하기 위해 사용하는 기술입니다. 사용자는 브라우저를 통해 여러 페이지를 이동하더라도 서버는 세션을 통해 “아, 이건 같은 사용자구나” 하고 인식할 수 있어요.
이 기능은 로그인 유지, 장바구니, 마이페이지 등 다양한 서비스에서 핵심 역할을 합니다. 세션 정보는 사용자의 브라우저가 아니라 서버에 저장되며, 사용자에겐 세션 ID만 쿠키로 전달됩니다.
세션 시작과 저장 방법
세션은 PHP에서 매우 간단하게 시작할 수 있어요. session_start()
함수만 호출하면 현재 사용자의 세션이 자동으로 생성되거나 기존 세션에 연결됩니다. 세션 데이터를 저장하려면 $_SESSION
배열을 사용하면 됩니다.
<?php
session_start(); // 세션 시작
$_SESSION['username'] = "minji"; // 세션 변수 저장
$_SESSION['is_login'] = true;
echo "세션 저장 완료!";
?>
코드 | 의미 |
---|---|
session_start() |
세션을 초기화하거나 기존 세션에 연결 |
$_SESSION['key'] = value |
세션 변수 등록 및 저장 |
$_SESSION['username'] |
세션에 저장된 사용자 이름 조회 |
세션 값 읽기와 삭제
세션에 저장된 값을 사용하는 것은 매우 간단합니다. $_SESSION['key']
형태로 꺼낼 수 있고, 필요 없을 때는 삭제하거나 세션 전체를 파기할 수도 있어요.
$_SESSION['username']
— 특정 세션 값 조회unset($_SESSION['username'])
— 특정 값 삭제session_destroy()
— 모든 세션 값 제거session_unset()
— 세션 변수만 초기화
session_start();
echo $_SESSION['username']; // "minji"
unset($_SESSION['username']); // 삭제
session_destroy(); // 전체 세션 종료
로그인 유지에 세션 활용하기
로그인 기능을 구현할 때, 세션은 사용자 인증 정보를 유지하는 데 꼭 필요합니다. 사용자가 로그인에 성공하면 세션에 사용자 정보를 저장하고, 이후 페이지들에서 해당 정보를 불러와 로그인 상태를 유지할 수 있어요.
// login.php
session_start();
if ($id === 'admin' && $pw === '1234') {
$_SESSION['is_login'] = true;
$_SESSION['user_id'] = $id;
header("Location: dashboard.php");
}
// dashboard.php
session_start();
if (!isset($_SESSION['is_login']) || $_SESSION['is_login'] !== true) {
header("Location: login.php");
exit;
}
echo "어서오세요, " . $_SESSION['user_id'] . "님!";
이런 식으로 세션을 활용하면 로그인 여부를 항상 체크할 수 있어서, 인증이 필요한 페이지에서 안전하게 접근 제어를 할 수 있습니다.
세션 관련 에러와 해결법
세션을 다루다 보면 생각보다 자주 에러가 발생해요. 대부분은 기본적인 실수에서 시작되지만, 놓치기 쉬운 부분이 많습니다.
아래 표에서 가장 흔한 에러와 해결 방법을 정리했어요.
문제 상황 | 원인 및 해결 |
---|---|
세션 값이 저장되지 않음 | session_start()가 없거나, header 출력 전에 세션 시작이 안 됨 |
Warning: headers already sent | 세션 시작 전에 echo나 공백 출력 발생 → session_start()는 맨 위에! |
세션이 페이지 간 유지되지 않음 | 브라우저 쿠키 허용 여부, 도메인 차이, session.cookie 설정 확인 필요 |
보안을 위한 세션 관리 팁
세션은 민감한 사용자 정보를 다루기 때문에 반드시 보안에도 신경 써야 해요. 아래 팁들을 참고해 안전한 세션 관리 습관을 들이세요.
session_regenerate_id(true)
로 세션 하이재킹 방지- 로그아웃 시
session_unset()
과session_destroy()
모두 호출 - 쿠키 설정 시
httponly, secure
옵션 함께 적용 - 세션 저장 시간 설정 (예: 30분 이상 비활성 시 만료)
- 세션에 저장하는 값은 최소화하고 꼭 필요한 정보만
네! 세션을 시작하기 전에 HTML이든 공백이든 출력이 발생하면 “headers already sent” 에러가 납니다. 항상 PHP 파일 맨 위에 선언하세요.
세션에 로그인 상태 변수를 등록해두고, 페이지마다 해당 변수가 설정돼 있는지 검사해서 로그인하지 않았으면 접근을 막는 식으로 구현합니다.
브라우저를 종료하면 기본적으로 세션 쿠키도 함께 사라집니다. 하지만 서버에 저장된 세션 데이터는 일정 시간 동안 유지됩니다 (기본 24분 또는 서버 설정에 따름).
세션 ID는 브라우저의 쿠키에 저장됩니다. PHP는 이 ID를 통해 사용자의 세션 데이터를 서버에서 찾아냅니다. 이 값이 노출되지 않도록 주의해야 해요.
세션 하이재킹을 막기 위해 로그인 시 session_regenerate_id(true)
를 꼭 사용하고, 보안 연결(HTTPS), 쿠키 보안 옵션을 함께 설정하는 게 필수입니다.
기술적으로는 가능하지만, 남아 있는 세션 값들을 지우기 위해 session_unset()
을 함께 사용하는 것이 좋습니다. 완전한 로그아웃 처리를 위해선 두 함수 모두 쓰는 걸 권장합니다.
처음엔 저도 세션이 뭔지 몰라서 로그인 기능 만들다가 로그인 유지가 안 되길래 한참을 헤맸던 기억이 나요. 그런데 세션 개념을 이해하고 나니 “와, 이거 진짜 편리한 도구구나!” 싶었습니다. PHP의 세션은 몇 줄 코드만으로도 사용자의 로그인 상태나 장바구니 데이터를 유지할 수 있어서, 초보 개발자에게는 정말 강력한 무기예요. 중요한 건 항상 session_start()
는 맨 위에, 그리고 민감한 정보는 절대 세션에 남기지 않는 습관을 들이는 거예요. 오늘 이 글을 따라오셨다면, 이제 로그인 유지뿐 아니라 다양한 기능에도 세션을 자유자재로 활용하실 수 있을 거예요. 여러분의 프로젝트에 꼭 적용해보시고, 직접 로그아웃 버튼도 만들어보세요! 💜
'💻 쇼핑몰 자동화 & 웹 개발 가이드' 카테고리의 다른 글
[PHP 입문] CRUD 게시판 만들기 입문 가이드 (24) | 2025.04.16 |
---|---|
[PHP 입문] MySQL 연동 기초: 데이터베이스 첫걸음 (36) | 2025.04.15 |
[PHP 입문] 로그인 시스템 완성: 세션, 보안 처리까지 (69) | 2025.04.11 |
[PHP 입문] 함수 완전 정복: 선언, 매개변수, 반환, 내장함수 (52) | 2025.04.10 |
[PHP 입문] 기초 문법 완전 가이드: 조건문, 반복문, 변수 (56) | 2025.04.09 |