세션(1)

minah moon·2023년 8월 22일

PHP

목록 보기
36/58
post-thumbnail

세션이란?

세션은 사용자에 대한 정보와 서버의 설정을 저장한다. 사이트에 한 번 방문하는 동안에만 데이터를 저장하기 때문에 세션이라 부른다.

세션이 저장되면 PHP 인터프리터는 세 가지를 생성한다.

  • 세션 ID, 개별 방문자를 식별하는 데 사용되는 문자열

  • 세션 파일, 서버에 저장되는 텍스트 파일이다. 이것은 해당 사용자에 대한 데이터를 저장하는 데 사용된다. 파일명에 세션 ID가 포함된다.

  • 세션 쿠키, 브라우저에 저장된다. 이름은 PHPSESSID이고 값은 사용자의 세션 ID이다.


세션 데이터 가져오기

브라우저가 세션 쿠키를 가지로 있다면, 사용자가 사이트의 다른 페이지를 요청할 때마다 서버로 전송된다. 세션 ID는 사용자를 식별하는 데 사용되므로 서버는 다음을 수행할 수 있다.

  • 쿠키로 전송된 세션 ID가 파일명에 포함된 세션 파일을 찾는다.

  • 세션 파일에서 데이터를 가져와서 슈퍼글로벌 배열인 $_SESSION에 넣으므로 페이지가 접근할 수 있다.


세션 데이터 저장하기

세션이 생성되면, 새로운 데이터가 슈퍼글로벌 배열인 $_SESSION에 추가되므로 해당 사용자의 세션에 저장될 수 있다.

페이지 실행이 완료되면, PHP 인터프리터는 슈퍼글로벌 배열인 $_SESSION의 모든 데이터를 가져와서 사용자 세션 파일에 저장한다. 세션 파일에 데이터를 저장하면 마지막 수정 시간이 업데이트되며 PHP 인터프리터는 이 시간을 확인하여 세션이 최근에 사용되었는지 알 수 있다.


세션 지속 시간

이를 위해 세션은 브라우저의 세션 쿠키와 서버의 세션 파일이 모두 필요하다.

  • 세션 쿠키는 사용자가 브라우저를 닫으면 만료된다.
  • 세션 파일은 일정 시간(디폴트는 24분) 안에 수정되지 않으면 서버에 의해 삭제될 수 있다.

세션 시작 방법

사이트가 세션을 사용할 때, 모든 페이지는 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

0개의 댓글