세션 처리

세션 처리 (Session Handling)

세션(session)이란 방문자가 여러 번 요청을 보내도 데이터가 그 사이에 이어질 수 있게 해 주는 메커니즘이에요. PHP의 세션 지원은 "여러 번의 연속적인 접근 사이에 어떤 데이터를 보존하는 방법"을 제공하는데, 핵심은 이렇습니다.

출처: PHP 공식 매뉴얼 - Session Handling

본문

사이트를 방문하는 사용자에게는 고유한 id, 즉 세션 id가 부여돼요. 이 세션 id는 사용자 쪽 쿠키에 저장되거나, URL에 실려 전파됩니다. 그리고 PHP는 이 id로 "아까 그 사용자"임을 알아봐요.

PHP의 세션 지원은 $_SESSION 슈퍼글로벌 배열에 데이터를 저장합니다. 방문자가 사이트를 다시 찾으면 PHP는 다음 두 경우에 요청에 세션 id가 함께 왔는지 자동으로 확인해요.

  • session.auto_start1로 설정된 경우 — 자동으로
  • 직접 session_start()를 호출한 경우 — 명시적으로

세션 id가 확인되면, 이전에 저장해 둔 환경(세션 데이터)이 그대로 복원됩니다. 즉, 로그인 상태나 장바구니 같은 데이터가 요청 사이에 살아남는 거죠.

주의할 점

session.auto_start를 켜면 세션에 객체를 넣으려면 auto_prepend_file로 클래스 정의를 먼저 로드해야 해요. 그렇지 않으면 객체를 serialize()했다가 나중에 unserialize()로 되살리는 수밖에 없습니다.

$_SESSION(그리고 등록된 모든 변수)은 요청이 끝난 뒤 PHP가 session.serialize_handler INI 설정에 지정된 직렬화 핸들러로 내부적으로 직렬화해요. 등록됐지만 정의되지 않은 변수는 "정의되지 않음"으로 표시되고, 이후 접근에서도 사용자가 다시 정의하지 않는 한 정의되지 않은 채 남습니다.

Warning — 세션 데이터는 직렬화되기 때문에 resource 변수는 세션에 저장할 수 없어요.

직렬화 핸들러 phpphp_binaryregister_globals의 제약을 그대로 물려받아요. 그래서 숫자 인덱스나 |, ! 같은 특수 문자가 포함된 문자열 인덱스는 사용할 수 없고, 쓰면 스크립트 종료 시점에 오류가 나요. 반면 php_serialize는 이런 제약이 없습니다.

Note — 세션 레코드는 실제로 변수가 하나 등록되기 전까지(즉 $_SESSION 슈퍼글로벀 배열에 새 키를 추가하기 전까지) 생성되지 않아요. session_start()로 세션이 시작됐는지와는 관계없이 그렇습니다.

구성 요소

  • 설치/설정: Requirements, Installation, Runtime Configuration, Predefined Constants
  • 예제: 기본 사용법, 세션 id 전달, 커스텀 세션 핸들러, 업로드 진행 표시, 세션과 보안, 세션 관리 기본, 세션 INI 설정 보안

세션 함수 일람

  • session_abort — 세션 배열 변경을 버리고 세션 종료
  • session_cache_expire — 현재 캐시 만료 설정을 가져오고/설정
  • session_cache_limiter — 현재 캐시 제한자를 가져오고/설정
  • session_commitsession_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, write
  • SessionHandlerInterface 인터페이스 — close, destroy, gc, open, read, write
  • SessionIdInterface 인터페이스 — create_sid
  • SessionUpdateTimestampHandlerInterface 인터페이스 — updateTimestamp, validateId

더 알아보기