본문 바로가기

PHP 세션을 사용하는 기본적인 방법

반응형

PHP에서 세션은 $_SESSION 배열을 통해 값을 저장하고 불러올 수 있습니다.

세션을 사용하는 기본적인 방법은 다음과 같습니다.

1. 세션 시작하기

세션을 사용하려면 모든 페이지 상단에 session_start()를 호출해야 합니다.

이 함수는 세션을 시작하고, 기존 세션이 있으면 해당 세션을 불러옵니다.

<?php
// 세션 시작
session_start();
?>

2. 세션에 값 저장하기

쿠키와 마찬가지로 세션은 키-값 쌍으로 데이터를 저장할 수 있습니다.

<?php
// 세션 시작
session_start();

// 세션에 값 저장
$_SESSION['admin_cokey'] = 'bo';
$_SESSION['vipmember'] = 'ok';
?>

이 코드는 admin_cokey와 vipmember라는 두 개의 세션 변수를 생성하고 값을 각각 'bo', 'ok'로 설정합니다.

3. 세션 값 사용하기

저장한 세션 값을 불러오는 방법은 $_SESSION 배열에서 해당 값을 가져오면 됩니다.

<?php
// 세션 시작
session_start();

// 세션 값 사용
if (isset($_SESSION['admin_cokey'])) {
    echo 'Admin Cookie Key: ' . $_SESSION['admin_cokey'];
}

if (isset($_SESSION['vipmember'])) {
    echo 'VIP Member Status: ' . $_SESSION['vipmember'];
}
?>

4. 세션 값 삭제하기

세션 값은 unset() 함수를 사용하여 특정 세션 값을 삭제할 수 있습니다.

<?php
// 세션 시작
session_start();

// 세션 값 삭제
unset($_SESSION['admin_cokey']);
unset($_SESSION['vipmember']);
?>

5. 세션 전체 파기하기

모든 세션 값을 삭제하고 세션을 완전히 종료하고 싶을 때는 session_destroy()를 사용합니다.

<?php
// 세션 시작
session_start();

// 모든 세션 값 삭제
session_unset();

// 세션 종료
session_destroy();
?>

요약

  • 세션 시작: session_start()로 세션을 시작합니다.
  • 세션 값 저장: $_SESSION['키'] = 값;으로 값을 저장합니다.
  • 세션 값 불러오기: $_SESSION['키']로 값을 불러옵니다.
  • 세션 값 삭제: unset($_SESSION['키']);로 특정 세션 값을 삭제합니다.
  • 세션 종료: session_unset()  session_destroy()로 모든 세션 값을 삭제하고 세션을 종료합니다.

쿠키와 달리 세션은 서버에 저장되므로 클라이언트 측에서 직접 수정할 수 없다는 장점이 있습니다.

 

PHP 세션 자체는 브라우저를 닫을 때 자동으로 삭제되지 않기 때문에 이를 제어할 수 있는 방법이 필요합니다.

기본적으로 PHP 세션은 서버에 저장되며, 브라우저는 세션 쿠키를 통해 세션을 식별합니다.

방법 1: PHP 기본 세션 설정 사용 (세션 쿠키가 브라우저 종료 시 만료되도록 설정)

PHP 세션 쿠키는 기본적으로 브라우저가 닫히면 만료됩니다.

이는 session.cookie_lifetime이 0으로 설정되어 있을 때 동작합니다.

이 경우 세션은 브라우저가 닫힐 때 쿠키와 함께 삭제됩니다.

방법

1. PHP 설정 확인: php.ini 파일에서 session.cookie_lifetime이 0으로 설정되어 있는지 확인합니다.

; php.ini 설정
session.cookie_lifetime = 0

 

2. PHP 코드 내에서 설정: PHP 코드에서 세션의 쿠키 수명을 0으로 설정할 수도 있습니다.

<?php
// 세션 쿠키 수명을 0으로 설정 (브라우저가 닫히면 쿠키 삭제)
ini_set('session.cookie_lifetime', 0);

// 세션 시작
session_start();

// 세션 값 설정
$_SESSION['admin_cokey'] = 'bo';
$_SESSION['vipmember'] = 'ok';
?>

방법 2: JavaScript를 사용하여 브라우저 종료 시 세션 처리

브라우저가 닫힐 때 이벤트를 감지하고 세션을 삭제하는 방법도 있습니다.

이 경우, JavaScript를 이용하여 사용자가 브라우저를 닫을 때 서버에 요청을 보내 세션을 삭제하도록 할 수 있습니다.

방법

  1. JavaScript에서 브라우저 종료 감지: 브라우저의 beforeunload 이벤트를 사용하여 브라우저가 닫히기 전에 서버로 요청을 보냅니다.
  2. PHP에서 세션 삭제: 요청을 처리하여 서버에서 세션을 삭제합니다.
<script>
window.addEventListener("beforeunload", function() {
    // 브라우저가 닫히기 전에 서버에 요청을 보냅니다.
    navigator.sendBeacon('/logout.php');
});
</script>

/logout.php 파일에서 세션을 삭제하는 PHP 코드를 작성합니다.

<?php
// 세션 시작
session_start();

// 모든 세션 값 삭제
session_unset();
session_destroy();
?>

방법 3: 세션 만료 시간을 짧게 설정

세션의 만료 시간을 짧게 설정하여 브라우저가 닫힌 후 빠르게 세션이 만료되도록 설정할 수도 있습니다.

이를 위해 session.gc_maxlifetime 값을 짧게 설정합니다.

<?php
// 세션 만료 시간을 5분으로 설정 (300초)
ini_set('session.gc_maxlifetime', 300);

// 세션 시작
session_start();
?>

요약

  1. 브라우저 종료 시 세션 삭제: 기본적으로 PHP 세션 쿠키는 브라우저가 닫히면 만료됩니다.
  2. PHP 설정으로 제어: session.cookie_lifetime을 0으로 설정하여 브라우저가 닫힐 때 세션이 삭제되도록 설정할 수 있습니다.
  3. JavaScript로 브라우저 종료 감지: beforeunload 이벤트를 사용하여 브라우저 종료 시 서버에 요청을 보내 세션을 삭제할 수 있습니다.
  4. 세션 만료 시간 단축: session.gc_maxlifetime 설정을 이용해 세션 만료 시간을 짧게 설정할 수도 있습니다.

 

session_start()는 항상 페이지의 최상단에 위치해야 합니다.

그 이유는, 세션이 시작될 때 HTTP 헤더를 통해 클라이언트와 서버 간의 세션 ID를 주고받기 때문입니다.

만약 session_start() 이전에 어떤 출력이 발생하면, PHP는 이미 헤더를 전송한 상태로 인식하기 때문에 세션을 시작하려 할 때 오류가 발생합니다.

주의해야 할 사항

  1. 헤더 전송 이전에 위치: 세션은 반드시 HTML이나 다른 출력 전에 시작해야 합니다.  그렇지 않으면 "Cannot send session cookie - headers already sent"와 같은 오류가 발생합니다.
  2. 출력 버퍼링 사용: 만약 출력을 피할 수 없는 상황이라면 ob_start()를 사용하여 출력 버퍼링을 통해 헤더 전송 문제를 피할 수 있습니다.
<?php
ob_start(); // 출력 버퍼링 시작
session_start(); // 세션 시작

// 여기서부터 출력을 할 수 있습니다.
echo "세션이 정상적으로 시작되었습니다.";
ob_end_flush(); // 출력 버퍼링 종료 및 출력
?>

요약

  • 최상단에 위치해야 함: 출력(HTML, echo, print 등)이 발생하기 전에 session_start()를 호출해야 합니다.
  • 출력 버퍼링으로 대처 가능: 불가피하게 출력을 해야 하는 상황이라면 ob_start()를 사용하여 출력 버퍼링을 적용할 수 있습니다.

삼항 연산자를 사용하여 안전하게 사용

해당 코드는 삼항 연산자를 사용하여 $_SESSION['admin_cokey'] 값이 존재하는지 확인하고, 존재하면 그 값을 $admin_connect에 할당하며, 존재하지 않으면 null을 할당합니다.

<?php
// 세션 시작
session_start();

// 세션 값 불러오기
$admin_connect = isset($_SESSION['admin_cokey']) ? $_SESSION['admin_cokey'] : null;

// 값 확인 (디버깅용)
echo $admin_connect;
?>

설명:

  • isset($_SESSION['admin_cokey']): 세션 변수 admin_cokey가 설정되어 있는지 확인합니다.
  • $_SESSION['admin_cokey']: 세션 변수 admin_cokey의 값을 가져옵니다.
  • null: 세션 값이 없을 경우 null을 반환합니다.

이 방식은 세션 값이 존재하지 않거나 초기화되지 않았을 때도 오류 없이 처리가 가능하므로, 안전하고 권장되는 방법입니다.

 

PHP 세션은 서버 전체에서 동일한 세션으로 관리되기 때문에, 특정 경로나 하위 경로에 상관없이 동일한 도메인 내의 모든 경로에서 세션을 공유할 수 있습니다.

즉, 같은 서버에서 실행되는 다음 URL들은 모두 동일한 세션을 사용하게 됩니다.

세션의 동작 원리

  • 세션 식별: 세션은 세션 쿠키를 통해 클라이언트와 서버 간에 식별됩니다.  이 세션 쿠키는 기본적으로 해당 도메인에 적용되므로, 동일한 도메인 내에서는 어떤 경로든지 같은 세션을 사용합니다.
  • 경로 설정: PHP 세션 쿠키의 경로는 기본적으로 /로 설정되어 있기 때문에, 도메인 내의 모든 경로에서 동일한 세션을 사용하게 됩니다.

세션의 쿠키 경로 설정

특정 경로에만 세션을 적용하고 싶다면, 세션 쿠키의 경로를 제한할 수 있습니다.

예를 들어, 세션이 특정 경로에서만 유효하도록 하려면, session.cookie_path를 설정할 수 있습니다.

예시: 특정 경로에만 세션을 적용

<?php
// 세션 쿠키를 특정 경로에만 적용
ini_set('session.cookie_path', '/2/');

// 세션 시작
session_start();
?>

이 설정을 통해 세션은 http://도메인/2/ 경로와 그 하위 경로에서만 유효하게 적용됩니다.

 

반응형

댓글


Copyright ⓒ SmartWeb All rights reserved.