
세션은 사용자에 대한 정보와 서버의 설정을 저장한다. 사이트에 한 번 방문하는 동안에만 데이터를 저장하기 때문에 세션이라 부른다.
세션이 저장되면 PHP 인터프리터는 세 가지를 생성한다.
세션 ID, 개별 방문자를 식별하는 데 사용되는 문자열
세션 파일, 서버에 저장되는 텍스트 파일이다. 이것은 해당 사용자에 대한 데이터를 저장하는 데 사용된다. 파일명에 세션 ID가 포함된다.
세션 쿠키, 브라우저에 저장된다. 이름은 PHPSESSID이고 값은 사용자의 세션 ID이다.
브라우저가 세션 쿠키를 가지로 있다면, 사용자가 사이트의 다른 페이지를 요청할 때마다 서버로 전송된다. 세션 ID는 사용자를 식별하는 데 사용되므로 서버는 다음을 수행할 수 있다.
쿠키로 전송된 세션 ID가 파일명에 포함된 세션 파일을 찾는다.
세션 파일에서 데이터를 가져와서 슈퍼글로벌 배열인 $_SESSION에 넣으므로 페이지가 접근할 수 있다.
세션이 생성되면, 새로운 데이터가 슈퍼글로벌 배열인 $_SESSION에 추가되므로 해당 사용자의 세션에 저장될 수 있다.
페이지 실행이 완료되면, PHP 인터프리터는 슈퍼글로벌 배열인 $_SESSION의 모든 데이터를 가져와서 사용자 세션 파일에 저장한다. 세션 파일에 데이터를 저장하면 마지막 수정 시간이 업데이트되며 PHP 인터프리터는 이 시간을 확인하여 세션이 최근에 사용되었는지 알 수 있다.
이를 위해 세션은 브라우저의 세션 쿠키와 서버의 세션 파일이 모두 필요하다.
사이트가 세션을 사용할 때, 모든 페이지는 PHP의 내장 함수인 session_start()를 호출해야 한다. 이 함수가 호출될 때, 페이지를 요청하는 브라우저는 세션 쿠키를 보내지 않거나 일치하는 세션 파일을 찾을 수 없을 경우, PHP 인터프리터는 자동으로 해당 사용자에 대한 새로운 세션을 시작한다.
세션 쿠키를 사용하는 대신, 세션 ID를 URL에 추가할 수 있지만 이것은 덜 안전하다.
브라우저는 HTTP 요청을 사용하여 페이지를 요청한다.
서버에서 PHP 페이지는 session_start()를 호출한다. 브라우저는 세션 쿠키를 보내지 않으므로
해당 사용자에 대한 세션 ID를 생성한다.
해당 사용자의 데이터를 담을 세션 파일(파일명에 세션 ID가 포함됨)을 생성한다.
페이지는 슈퍼글로벌인 $_SESSION에 데이터를 추가한다. 페이지 실행이 끝나면, 이 배열의 값은 이 사용자를 위해 생성된 세션 파일에 추가된다.
서버는 요청된 페이지를 다시 보낸다.
세션 ID를 가지고 있는 세션 쿠키를 생성할 HTTP를 보낸다.
브라우저가 페이지를 표시한다.
세션 ID를 가진 세션 쿠키를 생성한다.
브라우저는 HTTP 요청을 사용하여 페이지를 요청한다.
세션 ID를 담은 HTTP 헤더를 전송한다.
서버에서 PHP 페이지는 session_start()를 호출한다. PHP 인터프리터는 세션 쿠키에 지정된 세션 ID를 가진 세션 파일을 찾고 다음을 수행한다.
페이지가 이 데이터를 사용할 수 있도록 세션 파일의 데이터를 슈퍼글로벌 배열인 $_SESSION에 추가한다.
배열의 데이터를 사용하여 페이지를 생성한다.
배열의 데이터를 업데이트할 수 있다.
페이지 실행이 끝나면, 슈퍼글로벌 $_SESSION의 값은 세션 파일에 저장된다. 이것은 세션 파일의 마지막 수정 시간을 업데이트한다.
서버는 요청 페이지를 다시 전송한다.
브라우저는 페이지를 표시한다.
사용자가 브라우저 창을 닫을 때까지 각 요청과 함께 세션 쿠키를 동일한 사이트로 전송한다.
세션을 사용하는 사이트의 모든 페이지는 session_start()를 호출해야 한다. 사용자가 세션을 가지고 있지 않다면 세션을 시작한다. 만약에 세션을 가지고 있다면 세션 데이터를 가져와서 슈퍼글로벌 배열인 $_SESSION에 넣는다.
session_start();
방문자가 session_start()를 호출하는 페이지를 처음 요청하면 새로운 세션 ID, 세션 쿠키 그리고 세션 파일이 생성된다.
세션 쿠키를 생성하기 위해 HTTP 헤더를 전송하기 때문에 이 함수는 콘텐츠가 브라우저로 전송되기 전에 호출되어야 한다.
또한, 세션 파일에서 슈퍼글로벌 배열인 $_SESSION으로 데이터를 전송하므로 페이지가 세션 데이터를 가져오기 전에 호출되어야 한다.
$_SESSION['name'] = 'Ivy'; $_SESSION['age'] = 27;
만약에 데이터를 슈퍼글로벌 배열인 $_SESSION에 추가한다면, 페이지 실행이 끝날 때 PHP 인터프리터는 해당 사용자에 대한 세션 파일에 데이터를 추가한다.
배열에 데이터를 추가하는 구문은 연관 배열에 하는 것과 동일하다. 키는 저장할 데이터를 설명하는 것이어야 한다.
각 키의 값은 스칼라값(문자열, 숫자, 또는 불리언) 또는 배열 및 객체일 수 있다. 오직 문자열만 저장하는 쿠키와는 다르게 이 데이터 타입은 유지된다.
$name = $_SESSION['username'] ?? null; $age = $_SESSION['age'] ?? null;
슈퍼글로벌 배열인 $_SESSION의 데이터를 수집할 때, 값이 누락된 경우를 대비하여 널 병합 연산자를 사용한다. 또는 입력 타입 INPUT_SESSION과 함께 PHP의 필터 함수를 사용한다.
- session_start() : 새로운 세션을 생성하거나 기존의 세션에서 데이터를 가져온다.
- session_set_cookie_params() : 세션 쿠키를 생성하는 데 사용되는 설정
- session_get_cookie_params() : 쿠키를 설정하는 데 사용되는 인수를 가진 배열을 반환한다.
- session_regenerate_id() : 새로운 세션 ID를 생성하고 세션 파일과 쿠키를 업데이트한다.
- session_destroy() : 서버에서 세션 파일을 삭제한다.
출처 - 존 두켓, <백엔드 프로그래밍을 위한 PHP & MySQL>, Jpub, 2022