차이
문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판이전 판다음 판 | 이전 판 | ||
tech:session [2013/12/16 10:56] – [세션 시작하기] 115.93.88.196 | tech:session [2016/07/12 09:26] (현재) – 바깥 편집 127.0.0.1 | ||
---|---|---|---|
줄 1: | 줄 1: | ||
+ | {{tag> | ||
+ | ======세션 (Session)====== | ||
+ | |||
+ | 서버는 클라이언트가 재접속 했을 때 해당 클라이언트를 구분할 수 있는 수단이 필요하다. | ||
+ | |||
+ | 이렇게 클라이언트와 서버간의 상태를 유지하기 위한 일반적인 방법으로 세션이라는 개념을 이용한다. | ||
+ | 클라이어트가 처음 접속했을 때 클라이언트에 유일한 세션 ID를 부여하게 되고 클라이언트는 이 ID를 자동으로 쿠키에 임시 저장하거나, | ||
+ | |||
+ | 당연히 서버에서도 같은 세션 ID를 보관하고 있어야 하며, 클라이언트는 서버에 요청을 할 때 부여 받은 세션 ID를 가지고 요청함으로써 서버는 클라이언트를 구분하게 된다. 그리고 서버에 보관된 세션 ID 하나당 메모리를 사용할 수 있게 되며 이 세션 메모리에는 ‘변수=값’의 형식으로 데이터를 보관할 수 있다. | ||
+ | |||
+ | 세션은 [[tech: | ||
+ | |||
+ | =====세션 시작하기===== | ||
+ | |||
+ | |||
+ | <code php><? | ||
+ | session_start() | ||
+ | ?></ | ||
+ | |||
+ | |||
+ | |||
+ | 이렇게 세션함수를 호출하면 유저의 시스템에 이전에 발급된 유효 세션이 있는지 확인하게 되고, 검사결과 이전값이 없다면, 새로 세션아이디를 생성하고 이전에 발급한 아이디가 있고, 유효하다면, | ||
+ | |||
+ | |||
+ | |||
+ | 세션을 사용하기를 원하는 페이지에는 무조건 맨위에 sessioin_start()를 해줘야 한다. 이 함수를 호출하기 전에는 어떤한 함수의 실행결과나 html코드도 먼저 브라우저에 전송되어서는 안되며, 이 함수를 호출전에 다른 태그를 사용할 경우 에러가 난다. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | <code php> | ||
+ | $passwd = " | ||
+ | session_register(" | ||
+ | session_register(" | ||
+ | </ | ||
+ | |||
+ | logid 같은 변수들의 값은 서버에 기록이 된다. | ||
+ | 보통 파일로 기록이 된다. | ||
+ | |||
+ | 이 경우 랜덤하게 유니크한 파일이름을 생성하여 ''/ | ||
+ | |||
+ | sess_50fffa7e58f63c83ac0473fb928f17ed | ||
+ | |||
+ | 그리구 나서 이 파일이름을 클라이언트에게 보내주고, | ||
+ | |||
+ | |||
+ | |||
+ | ====세션의 유지==== | ||
+ | - 세션을 사용한 브라우저에 메뉴의 " | ||
+ | - 현재 브라우저에서 주소표시줄에 같은 도메인의 다른 URL 을 쳐서 이동을 해도 세션이 유지 | ||
+ | - 팝업창도 세션이 생성된 브라우저에서 열리면 그대로 세션이 유지된다. | ||
+ | - 익스플로어 아이콘을 통해 새창을 열면 현재 세션을 잃어 버리고 새로운 세션을 얻게 된다. | ||
+ | - 세션 유지 시간을 넘기면 자동으로 세션이 소멸된다. 세션을 생성한 페이지나 그이후에 페이지에서 유지시간동안 페이지 이동이 없다면 자동으로 세션이 소멸된다. | ||
+ | - 세션을 생성한 브라우저을 닫으면 세션도 소멸된다. | ||
+ | |||
+ | ====세션의 유지 시간==== | ||
+ | |||
+ | ===현재 설정된 세션 유지시간 보기=== | ||
+ | |||
+ | (단위: | ||
+ | |||
+ | <code php><? | ||
+ | |||
+ | |||
+ | ===세션 유지시간 설정하기=== | ||
+ | |||
+ | <code php><? | ||
+ | //# session_start() 전에 사용해야함\ | ||
+ | //# 세션유지시간: | ||
+ | session_cache_expire(30); | ||
+ | session_start(); | ||
+ | ?></ | ||
+ | |||
+ | =====세션에 내용 등록===== | ||
+ | |||
+ | <code php> | ||
+ | $_SESSION[" | ||
+ | $_SESSION[" | ||
+ | |||
+ | 세션 등록과 대입이 1단계이다. | ||
+ | |||
+ | =====세션의 변수 삭제===== | ||
+ | |||
+ | <code php> | ||
+ | session_unset(" | ||
+ | </ | ||
+ | |||
+ | <code php> | ||
+ | session_is_registered(" | ||
+ | =====세션 공유===== | ||
+ | |||
+ | * [[http:// | ||
+ | | ||
+ | 이것은 NFS server 로 작업했을 때 발생하는 많은 데이터 보전과 보안 이슈를 해결 가능하게 한다. | ||
+ | 그러나 여전히 아래에 설명된 몇 가지 이슈들로 인해 문내가 된다. | ||
+ | |||
+ | 로컬세션 접근보다 현저하게 느려지는 현상에 덧붙여 database 에 세션데이터를 저장하는 것은 데이터베이스에 부가적인 스트레스를 주게 된다. | ||
+ | |||
+ | 데이터베이스는 단 하나의 failure 포인트로 남게 될 것이며 | ||
+ | |||
+ | 데이터베이스에 세션데이터를 저장하는 것은 확장된 병목현상을 야기한다. (특히 클러스터의 확장성이 세션데이터를 제공하는 데이터베이스의 성능 뿐만 아니라 | ||
+ | 세션을 다루며 발생하는 로드에 의해 전체적으로 약화되는 데이터베이스의 성능에 의해서도 약화된다))) | ||
+ | * [[http:// | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | php.ini ''/ | ||
+ | |||
+ | session.save_handler = files ; 저장방식은 파일로 (db도 가능) | ||
+ | session.save_path = /tmp ; 위치는 /tmp | ||
+ | session.name = PHPSESSID ; 쿠키로 발행될 쿠키변수 이름 | ||
+ | session.cookie_path = / ; 쿠키가 유효한 디렉토리 | ||
+ | session.cookie_domain = ; 쿠키가 유효한 도메인인데 기본은 비어있다 | ||
+ | |||
+ | |||
+ | 요렇게 되어 있다. 그래서 디폴트 상태로 세션을 쓰게 되면 쿠키로 발행된 세션의 파일이름은 현재의 도메인에만 먹게 된다. | ||
+ | |||
+ | session.cookie_domain = .vaslor.net; | ||
+ | |||
+ | 이렇게 해당 도메인을 넣어주면 쿠키로 발행된 PHPSESSID 는 .vaslor.net 의 모든 서버에서 먹게 된다... (:!: 점이 반드시 필요:!:) | ||
+ | 만약 물리적으로 같은 서버인데 도메인만 틀릴 경우에는 이렇게만 해도 된다. | ||
+ | ([[apache|아파치]] (혹은 [[tech: | ||
+ | |||
+ | |||
+ | session.save_path = /tmp ; | ||
+ | |||
+ | 그러나 서버가 다르다면 문제가 있다. | ||
+ | |||
+ | 이럴땐 nfs 등의 디렉토리 공유 방법을 써서 그쪽 디렉토리 이름으로 지정을 하거나, | ||
+ | 이건 세션핸들러 등으로 검색하면 잘 설명되어 있으니 그걸 참조하라. | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ^ 누구나 수정하실 수 있다. [[http:// | ||
+ | |||