💻 쇼핑몰 자동화 & 웹 개발 가이드

[PHP 입문] 세션(Session) 개념과 로그인 상태 유지 구현

rhandy 2025. 4. 14. 07:10

로그인했는데 다음 페이지 가니까 로그아웃?! 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분 이상 비활성 시 만료)
  • 세션에 저장하는 값은 최소화하고 꼭 필요한 정보만
Q session_start()는 꼭 맨 위에 써야 하나요?

네! 세션을 시작하기 전에 HTML이든 공백이든 출력이 발생하면 “headers already sent” 에러가 납니다. 항상 PHP 파일 맨 위에 선언하세요.

A 네, session_start()는 항상 맨 위에 위치시켜야 해요!
Q 로그인 안 한 사용자가 세션에 접근하면 어떻게 하나요?

세션에 로그인 상태 변수를 등록해두고, 페이지마다 해당 변수가 설정돼 있는지 검사해서 로그인하지 않았으면 접근을 막는 식으로 구현합니다.

A 세션 검사 조건문으로 로그인 상태를 체크하세요!
Q 세션은 브라우저를 꺼도 유지되나요?

브라우저를 종료하면 기본적으로 세션 쿠키도 함께 사라집니다. 하지만 서버에 저장된 세션 데이터는 일정 시간 동안 유지됩니다 (기본 24분 또는 서버 설정에 따름).

A 브라우저 종료 시 세션 쿠키는 사라지지만, 서버에선 일정 시간 유지돼요!
Q 세션 ID는 어디에 저장되나요?

세션 ID는 브라우저의 쿠키에 저장됩니다. PHP는 이 ID를 통해 사용자의 세션 데이터를 서버에서 찾아냅니다. 이 값이 노출되지 않도록 주의해야 해요.

A 세션 ID는 쿠키에 저장되고, 서버는 그걸로 사용자 구분해요!
Q 다른 사용자가 내 세션을 탈취하면 어떻게 하나요?

세션 하이재킹을 막기 위해 로그인 시 session_regenerate_id(true)를 꼭 사용하고, 보안 연결(HTTPS), 쿠키 보안 옵션을 함께 설정하는 게 필수입니다.

A 세션 탈취 방지에는 session_regenerate_id()가 필수예요!
Q session_destroy()만 쓰면 로그아웃 되나요?

기술적으로는 가능하지만, 남아 있는 세션 값들을 지우기 위해 session_unset()을 함께 사용하는 것이 좋습니다. 완전한 로그아웃 처리를 위해선 두 함수 모두 쓰는 걸 권장합니다.

A session_unset() + session_destroy() = 완전한 로그아웃!

 

처음엔 저도 세션이 뭔지 몰라서 로그인 기능 만들다가 로그인 유지가 안 되길래 한참을 헤맸던 기억이 나요. 그런데 세션 개념을 이해하고 나니 “와, 이거 진짜 편리한 도구구나!” 싶었습니다. PHP의 세션은 몇 줄 코드만으로도 사용자의 로그인 상태나 장바구니 데이터를 유지할 수 있어서, 초보 개발자에게는 정말 강력한 무기예요. 중요한 건 항상 session_start()는 맨 위에, 그리고 민감한 정보는 절대 세션에 남기지 않는 습관을 들이는 거예요. 오늘 이 글을 따라오셨다면, 이제 로그인 유지뿐 아니라 다양한 기능에도 세션을 자유자재로 활용하실 수 있을 거예요. 여러분의 프로젝트에 꼭 적용해보시고, 직접 로그아웃 버튼도 만들어보세요! 💜