세션 처리
세션 처리 (Session Handling)
세션(session)이란 방문자가 여러 번 요청을 보내도 데이터가 그 사이에 이어질 수 있게 해 주는 메커니즘이에요. PHP의 세션 지원은 "여러 번의 연속적인 접근 사이에 어떤 데이터를 보존하는 방법"을 제공하는데, 핵심은 이렇습니다.
본문
사이트를 방문하는 사용자에게는 고유한 id, 즉 세션 id가 부여돼요. 이 세션 id는 사용자 쪽 쿠키에 저장되거나, URL에 실려 전파됩니다. 그리고 PHP는 이 id로 "아까 그 사용자"임을 알아봐요.
PHP의 세션 지원은 $_SESSION 슈퍼글로벌 배열에 데이터를 저장합니다. 방문자가 사이트를 다시 찾으면 PHP는 다음 두 경우에 요청에 세션 id가 함께 왔는지 자동으로 확인해요.
session.auto_start가1로 설정된 경우 — 자동으로- 직접
session_start()를 호출한 경우 — 명시적으로
세션 id가 확인되면, 이전에 저장해 둔 환경(세션 데이터)이 그대로 복원됩니다. 즉, 로그인 상태나 장바구니 같은 데이터가 요청 사이에 살아남는 거죠.
주의할 점
session.auto_start를 켜면 세션에 객체를 넣으려면 auto_prepend_file로 클래스 정의를 먼저 로드해야 해요. 그렇지 않으면 객체를 serialize()했다가 나중에 unserialize()로 되살리는 수밖에 없습니다.
$_SESSION(그리고 등록된 모든 변수)은 요청이 끝난 뒤 PHP가 session.serialize_handler INI 설정에 지정된 직렬화 핸들러로 내부적으로 직렬화해요. 등록됐지만 정의되지 않은 변수는 "정의되지 않음"으로 표시되고, 이후 접근에서도 사용자가 다시 정의하지 않는 한 정의되지 않은 채 남습니다.
Warning — 세션 데이터는 직렬화되기 때문에 resource 변수는 세션에 저장할 수 없어요.
직렬화 핸들러 php와 php_binary는 register_globals의 제약을 그대로 물려받아요. 그래서 숫자 인덱스나 |, ! 같은 특수 문자가 포함된 문자열 인덱스는 사용할 수 없고, 쓰면 스크립트 종료 시점에 오류가 나요. 반면 php_serialize는 이런 제약이 없습니다.
Note — 세션 레코드는 실제로 변수가 하나 등록되기 전까지(즉 $_SESSION 슈퍼글로벀 배열에 새 키를 추가하기 전까지) 생성되지 않아요. session_start()로 세션이 시작됐는지와는 관계없이 그렇습니다.
구성 요소
- 설치/설정: Requirements, Installation, Runtime Configuration, Predefined Constants
- 예제: 기본 사용법, 세션 id 전달, 커스텀 세션 핸들러, 업로드 진행 표시, 세션과 보안, 세션 관리 기본, 세션 INI 설정 보안
세션 함수 일람
session_abort— 세션 배열 변경을 버리고 세션 종료session_cache_expire— 현재 캐시 만료 설정을 가져오고/설정session_cache_limiter— 현재 캐시 제한자를 가져오고/설정session_commit—session_write_close의 별칭session_create_id— 새 세션 id 생성session_decode— 세션 인코딩 문자열에서 세션 데이터 디코딩session_destroy— 세션에 등록된 모든 데이터 파괴session_encode— 현재 세션 데이터를 세션 인코딩 문자열로 인코딩session_gc— 세션 데이터 가비지 컬렉션 수행session_get_cookie_params— 세션 쿠키 매개변수 가져오기session_id— 현재 세션 id 가져오고/설정session_module_name— 현재 세션 모듈 가져오고/설정session_name— 현재 세션 이름 가져오고/설정session_regenerate_id— 새로 생성한 id로 현재 세션 id 갱신session_register_shutdown— 세션 종료 함수 등록session_reset— 세션 배열을 원래 값으로 재초기화session_save_path— 현재 세션 저장 경로 가져오고/설정session_set_cookie_params— 세션 쿠키 매개변수 설정session_set_save_handler— 사용자 수준 세션 저장 함수 설정session_start— 새 세션 시작 또는 기존 세션 재개session_status— 현재 세션 상태 반환session_unset— 모든 세션 변수 해제session_write_close— 세션 데이터를 쓰고 세션 종료
세션 핸들러 클래스·인터페이스
SessionHandler클래스 —close,create_sid,destroy,gc,open,read,writeSessionHandlerInterface인터페이스 —close,destroy,gc,open,read,writeSessionIdInterface인터페이스 —create_sidSessionUpdateTimestampHandlerInterface인터페이스 —updateTimestamp,validateId