차이

문서의 선택한 두 판 사이의 차이를 보여줍니다.

차이 보기로 링크

양쪽 이전 판이전 판
다음 판
이전 판
tech:session [2014/03/06 17:46] 115.93.88.196tech:session [2016/07/12 09:26] (현재) – 바깥 편집 127.0.0.1
줄 1: 줄 1:
 +{{tag>session}}
 +======세션 (Session)======
 +
 +서버는 클라이언트가 재접속 했을 때 해당 클라이언트를 구분할 수 있는 수단이 필요하다. 
 +
 +이렇게 클라이언트와 서버간의 상태를 유지하기 위한 일반적인 방법으로 세션이라는 개념을 이용한다. 
 +클라이어트가 처음 접속했을 때 클라이언트에 유일한 세션 ID를 부여하게 되고 클라이언트는 이 ID를 자동으로 쿠키에 임시 저장하거나, 쿠키가 지원되지 않을 경우에 URL 끝에 붙여 가지고 다니게 된다. 
 +
 +당연히 서버에서도 같은 세션 ID를 보관하고 있어야 하며, 클라이언트는 서버에 요청을 할 때 부여 받은 세션 ID를 가지고 요청함으로써 서버는 클라이언트를 구분하게 된다. 그리고 서버에 보관된 세션 ID 하나당 메모리를 사용할 수 있게 되며 이 세션 메모리에는 ‘변수=값’의 형식으로 데이터를 보관할 수 있다. 
 +
 +세션은 [[tech:cookie|]]의 단점을 보완하고자 만들어졌다. 
 +
 +=====세션 시작하기=====
 +
 + 
 +<code php><?php 
 +session_start()
 +?></code>
 +
 + 
 +
 +이렇게 세션함수를 호출하면 유저의 시스템에 이전에 발급된 유효 세션이 있는지 확인하게 되고, 검사결과 이전값이 없다면, 새로 세션아이디를 생성하고 이전에 발급한 아이디가 있고, 유효하다면, 서버에 저장한 데이터를 그대로 사용하게 되는 것 이다.
 +
 + 
 +
 +세션을 사용하기를 원하는 페이지에는 무조건 맨위에 sessioin_start()를 해줘야 한다. 이 함수를 호출하기 전에는 어떤한 함수의 실행결과나 html코드도 먼저 브라우저에 전송되어서는 안되며, 이 함수를 호출전에 다른 태그를 사용할 경우 에러가 난다. 
 +
 +
 + 
 +
 +<code php>$logid = "gagamel"; 
 +$passwd = "gozila"; 
 +session_register("logid"); 
 +session_register("passwd"); 
 +</code>
 +
 + logid 같은 변수들의 값은 서버에 기록이 된다. 
 +보통 파일로 기록이 된다. 
 +
 +이 경우 랜덤하게 유니크한 파일이름을 생성하여 ''/tmp'' 혹은  ''/var/lib/php5'' 에 저장이 된다. 
 +
 +  sess_50fffa7e58f63c83ac0473fb928f17ed
 +
 +그리구 나서 이 파일이름을 클라이언트에게 보내주고, 클라이언트는 이것을 쿠키로서 저장해 놓는다. 
 +
 +
 +
 +====세션의 유지====
 +  - 세션을 사용한 브라우저에 메뉴의 "파일/새로만들기/창" 을 이용해 새창을 열거나 링크부분에서 오른쪽 마우스로 "새창에서 열기"로 새창을 열면 세션이 유지되어 있다. 
 +  - 현재 브라우저에서 주소표시줄에 같은 도메인의 다른 URL 을 쳐서 이동을 해도 세션이 유지
 +  - 팝업창도 세션이 생성된 브라우저에서 열리면 그대로 세션이 유지된다.
 +  - 익스플로어 아이콘을 통해 새창을 열면 현재 세션을 잃어 버리고 새로운 세션을 얻게 된다.
 +  - 세션 유지 시간을 넘기면 자동으로 세션이 소멸된다. 세션을 생성한 페이지나 그이후에 페이지에서 유지시간동안 페이지 이동이 없다면 자동으로 세션이 소멸된다.
 +  - 세션을 생성한 브라우저을 닫으면 세션도 소멸된다.
 +
 +====세션의 유지 시간====
 +
 +===현재 설정된 세션 유지시간 보기===
 +
 +(단위:분)
 +
 +<code php><?= session_cache_expire(); ?></code>
 +
 + 
 +===세션 유지시간 설정하기===
 +
 +<code php><?php
 +//# session_start() 전에 사용해야함\
 +//# 세션유지시간:30분 설정
 +session_cache_expire(30);
 +session_start();
 +?></code>
 +
 +=====세션에 내용 등록=====
 +
 +<code php>session_start()
 +$_SESSION["nme"]="sunz";
 +$_SESSION["id"]="sunz";</code>
 +
 +세션 등록과 대입이 1단계이다.  이 방법은 서버의 register_globals 설정이 on이나 off인 상태에서도 사이트가 잘 돌아간다.
 +
 +=====세션의 변수 삭제=====
 + 
 +<code php>session_unregister("변수"); //변수값만 지운다
 +session_unset("변수");      //현재 변수의 값을 삭제하고 변수도 소멸시키는 함수
 +</code>
 +
 +<code php>
 +session_is_registered("string name") //세션 변수가 현재의 세션에 등록되어 있는지를 반환</code>
 +=====세션 공유=====
 +
 +  * [[http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=19190&sca=&sfl=wr_subject%7C%7Cwr_content&stx=%BC%BC%BC%C7%B0%F8%C0%AF&sop=and|다른 서버간 세션 공유 방법 (DB이용)]] ((**Database를 이용한 세션정보 공유의 이슈**
 + 서버들 사이에서 세션데이터를 공유하는 또 다른 방법은 세션정보를 데이터베이스에 저장하는 것이다.
 +이것은 NFS server 로 작업했을 때 발생하는 많은 데이터 보전과 보안 이슈를 해결 가능하게 한다.
 +그러나 여전히 아래에 설명된 몇 가지 이슈들로 인해 문내가 된다.
 +
 +로컬세션 접근보다 현저하게 느려지는 현상에 덧붙여 database 에 세션데이터를 저장하는 것은 데이터베이스에 부가적인 스트레스를 주게 된다.
 +
 +데이터베이스는 단 하나의 failure 포인트로 남게 될 것이며
 +
 +데이터베이스에 세션데이터를 저장하는 것은 확장된 병목현상을 야기한다. (특히 클러스터의 확장성이 세션데이터를 제공하는 데이터베이스의 성능 뿐만 아니라
 +세션을 다루며 발생하는 로드에 의해 전체적으로 약화되는 데이터베이스의 성능에 의해서도 약화된다)))
 +  * [[http://sktype.tistory.com/102|같은 도메인에서 서브도메인끼리 공유 방법]]
 +
 +
 +
 + 
 +
 +php.ini ''/etc/php5/apache2/php.ini'' 혹은 ''/etc/php5/fpm/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:nginx|엔진엑스]])와 [[tech:php|php5]]를 재시작해주는 것을 잊지말 것.)
 +
 +
 +  session.save_path = /tmp ; 
 +
 +그러나 서버가 다르다면 문제가 있다. 
 +
 +이럴땐 nfs 등의 디렉토리 공유 방법을 써서 그쪽 디렉토리 이름으로 지정을 하거나,  세션을 아예 db로 저장을 해서 공유하는 방법이 있다.
 +이건 세션핸들러 등으로 검색하면 잘 설명되어 있으니 그걸 참조하라. 
 +
 +
 +
 +
 +
 +
 +^  누구나 수정하실 수 있다. [[http://vaslor.net/syntax|위키 사용법]] 참고하라.  ^
 +