# 세션(Session)
세션이란 웹 사이트의 여러 페이지에 걸쳐 사용되는 사용자 정보를 저장하는 방법을 의미한다.
사용자가 브라우저를 닫아 서버와의 연결을 끝내는 시점까지를 세션이라고 한다.
쿠키는 클라이언트 측의 컴퓨터에 모든 데이터를 저장한다.
하지만 세션은 서비스가 돌아가는 서버 측에 데이터를 저장하고, 세션의 키값만을 클라이언트 측에 남겨둔다.
브라우저는 필요할 때마다 이 키값을 이용하여 서버에 저장된 데이터를 사용하게 된다.
세션은 보안에 취약한 쿠키를 보완해주는 역할을 하고 있다.
사용하는 법이 쉽기 때문에 로그인과 같은 인증 처리에 많이 사용된다.
1. 세션 시작
<?php
session_start();
?>
session_start() 함수를 이용하여 새로운 세션을 시작한다. 세션 아이디가 이미 존재하는지를 확인하고, 존재하지 않으면 새로운 아이디를 만듭니다. 만약, 이미 존재하는 세션 아이디가 있을 때는 기존 세션 변수를 다시 불러와서 사용 할 수 있습니다.
생성된 세션의 키 값은 브라우저의 개발자 도구를 통해 쉽게 확인할 수 있다.
php에서 세션을 생성하면 기본적으로 세션의 이름은 PHPSESSID로 저장된다. php 설정파일인 php.ini에서 변경이 가능하다. 일시적인 변경이 필요하면 session_name('변경할 이름')을 사용하여 변경을 할 수 있다.
session_name() 사용하려면 session_start()보다 위에 입력을 해야 오류없이 작동한다.
세션 유지 시간은 php.ini 파일에 명시되어있는데, session.gc_maxlifetime항목을 보면 1440(초 단위, 24분)으로 지정되어 있다. 이 시간이 지나면 아무런 요청이 없는 세션 데이터를 삭제하는 것으로 세션을 종료시킨다.
2. 세션 변수 등록
<?php
session_start();
//세션 변수 등록
$_SESSION['userName'] = 'tester';
$_SESSION['userPw'] = '1234';
//등록된 변수 사용
echo "userName 값: ".$_SESSION['userName']."<br/>";
echo "userPw 값: ".$_SESSION['userPw'];
?>
세션을 사용하여 변수를 등록하려면 $_SESSION['세션변수명'] = Data 형태로 사용하면 된다.
$_SESSION['userName'] = 'tester'; 라고 하면 userName이라는 세션 변수에 tester라는 값을 저장한다는 의미다.
등록된 세션 변수를 사용하는 것도 등록과 같다. 그대로 사용하게 되면 코드가 길어지므로 php 변수에 저장하여 사용하는게 편하다.
3. 세션 변수 등록 해제
<?php
session_start();
//세션 변수 등록
$_SESSION['userName'] = 'tester';
echo "userName 값: ".$_SESSION['userName'];
//등록된 변수 해제
unset($_SESSION['userName']);
echo "userName 값: ".$_SESSION['userName'];
?>
세션 변수의 사용이 모두 끝나면, 세션 변수의 등록을 해지할 수 있다.
unset($_SESSION['변수명']) 함수를 사용하면, 특정 이름의 세션 변수만을 해제되어 사용을 할 수 없게 된다.
현재 등록된 모든 세션 변수를 해지하고자 할 때는 session_unset()함수를 사용하면 된다.
또한, 세션 자체를 완전히 종료하려면 session_destory() 함수를 사용하여 세션 파일과 브라우저의 쿠키를 삭제하여 세션이 종료된다.
<? php
// 모든 세션 변수의 등록 해지
session_unset();
// 세션 아이디의 삭제
session_destroy();
?>
4. 세션 등록 여부 확인
<?php
//세션 파일 생성 여부 확인
if(!session_id()) {
session_start();
}
//변수 등록
$_SESSION['userId'] = '';
//변수 등록 여부 확인
if(!isset($_SESSION['userId'])) {
$_SESSION['userId'] = 'data1';
echo '새로운 변수 생성';
} else {
$_SESSION['userId'] = 'data2';
echo '기존 변수 데이터 변경';
}
echo '<br/>'.$_SESSION['userId'];
?>
isset() 함수를 사용하면 해당 변수에 등록이 되어있는지 확인 할 수 있다. isset($_SESSION['변수명']) 형태로 사용하며 만약 해당 변수가 등록이 되어있다면 true 값을 반환, 등록이 되어 있지 않다면 false를 반환한다.
위 코드는 변수가 생성되지 않았다면 data1을, 생성이 되어있다면 data2를 저장하고 변수의 값을 출력하는 코드이다. 실행해 보면 변수가 등록이 되어있으므로 data2가 출력이 되는 것을 볼 수 있다.
5. 세션 종료하기
기본적으로 php의 세션을 브라우저가 연결을 끊고 일정 시간이 지나면 세션 데이터가 저장된 파일을 삭제하는 것으로 완전히 종료가 된다.
그러나 사용자의 요청으로 세션을 종료하는 것으로 로그아웃 기능을 만들 때는 직접 세션을 종료시켜야 한다. 그럴때는 session_destroy() 함수를 사용한다.
<?php
//세션 데이터에 접근하기 위해 세션 시작
if (!session_id()) {
session_start();
}
// 세션 데이터 빈 배열로 초기화
$_SESSION = array();
// 또는 session_unset(); 사용
// 세션 ID 값이 저장되어 있는 쿠키 삭제
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(
session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
// 세션 파일 삭제
session_destroy();
?>
php 공식 문서에 따르면 session_destroy() 함수는 현재 세션의 모든 데이터를 파괴하는 함수다.
즉, 세션의 데이터가 저장되어 파일을 삭제하는 것이다.
그러나 단지 세션 파일을 삭제하는 것이지 세션 ID 값이 있는 쿠키는 그대로 남아있게 된다. 그래서 setcookie()함수를 사용해 세션 ID가 저장된 쿠키를 강제로 만료시켜 삭제 하는 것이다.
또한 $_SESSION 변수에 빈 배열을 넣는 이유도 같다. session_destroy() 함수가 $_SESSION 변수까지 해제하는 것이 아니기 때문에 빈 배열을 넣어 초기화 시켜주는 것이다. session_unset() 함수를 사용해도 같은 동작을 실행한다.
∴ 참고
php의 세션은 기본적으로 '파일 기반'이다. 이 방식은 세션 데이터를 서버의 디스크에 임시파일을 생성한 뒤 파일에 데이터를 저장하는 방식이다.
php의 설정에 따라 일정 시간이 지나면 세션 파일을 삭제 하지만 일정 확률로 파일을 삭제하는 것이라서 완전히 삭제가 되지 않는다. 또한, php 코드로 세션을 종료한 것이 아닌 브라우저 종료로 연결을 끊는 경우나 크롤링 등 프로그램을 연족적으로 접근하는 경우에는 파일이 그대로 남아있게 된다.
결국 로그아웃을 하지 않고 브라우저만 종료를 하는 사람이 많다면 그만큼 세션 파일이 쌓이게 되는 것이다. 한번씩 세션이 저장되는 폴더를 확인하여 오래된 파일을 삭제해 주는 것이 좋다.
참고 사이트 : https://teserre.tistory.com/8?category=937175
'🎨 Programming > PHP' 카테고리의 다른 글
[PHP] 문자열 찾기 (strpos) (0) | 2021.11.12 |
---|---|
[PHP] 변수 설정 여부 확인 (isset 함수) (0) | 2021.06.25 |
[PHP] strtotime() / date() 함수 (0) | 2021.03.13 |
[PHP] 배열(Array) 정렬 array_multisort () (0) | 2021.03.12 |
[PHP] 배열(Array) array_column() (0) | 2021.03.12 |