php


SESSION의 동작방식과 사용법 (feat. PHP)


오늘은 세션의 동작원리들과 주의할점! 그리고 사용법에 관해 포스팅하도록 하겠습니다.


시작하기 전에 먼저 세션에 대해 간단히 설명하자면 세션은 컴퓨터 시스템의 관리자(또는 OS 또는 서버)가 자신의 자산을 이용하는것을 허락한 사용자 (컴퓨팅)를 인식한 일정한 기간을 가리키는것으로 광범위하게 이해될 수 있습니다. 위키백과;세션


쿠키와의 차이점은 쿠키는 정보를 사용자의 컴퓨터에 저장하는 반면, 세션은 정보를 서버에 저장한다는 점에서 비교적 보안성이 더 우수합니다.

또한, 세션은 쿠키에 비해 큰 용량의 데이터를 저장할 수 있습니다.

하지만 세션의 동작방식을 알아보면 세션도 고유식별자를 확인하는데 있어, 쿠키를 이용하긴 합니다.

그러나, 쿠키를 이용하긴하지만 오로지 쿠키에만 의존적이진 않습니다.

뭐, 쿠키없이 사용할 순 있지만, 쿠키를 이용하면 더 편하게 세션을 이용할 수 있다는 뜻입니다.!


그럼 이제! 세션사용법을 간단하게 알아보도록 하겠습니다.

세션위주로만 설명하므로 자세한 소스는 생략합니다! PHP 세션 로그인 예제 보러가기






SESSION 설정 보기



세션을 사용해보기 전에 기본적인 session 설정부터 알아보겠습니다.

php.ini 파일을 보면 세션에 관한 내용들이 정의되어 있습니다.

나는 ini 파일을 수정하지 않겠다! 혹은 파일을 볼 수 없다! 의 경우 phpinfo() 함수를 이용하여 session 으로 찾아보면 설정된 내용을 볼 수 있습니다.

ini 파일 위치를 모르겠다! 싶을 때도 phpinfo() 함수를 사용해서, Loaded Configuration File 로 검색하면 위치를 찾을 수 있습니다.

아래는 phpinfo() 로 확인한 세션정보입니다.


설정정보들 중 몇가지만 알아보자면,

session.name : 세션ID를 저장할 쿠키의 이름입니다. 보통 PHPSESSID 로 사용하며, php의 세션함수 session_name()로 가져올 수 있습니다.

session.cookie_path : 세션ID를 저장할 쿠키의 경로입니다. 가끔 쿠키삭제가 안될 경우에 setcookie() 마지막 파라미터에 이 경로를 직접 지정해주면 삭제가 잘됩니다!

session.save_path : 세션이 저장되는 경로입니다. 따로 지정해 주지 않을경우, 이 경로 하위에 세션파일들이 쌓입니다.

session.use_cookies : 세션ID를 저장하는데 쿠키를 사용할지 하지 않을지를 정합니다. 1은 사용함을 나타내며 사용하지 않을경우 아래옵션을1로 설정해주어야합니다.

session.use_trans_id : 세션ID를 저장하는데 쿠키를 사용하지 않을경우, 이 옵션을 1로 변경해주어야 합니다.

session.gc_maxlifetime : 지정된 시간(초) 이 지난 세션은 폐기 대상으로 간주합니다.



위의 설정 값을 바꾸고싶은데 특정 프로젝트에서만 동적으로 변경하고자 하는 경우나, php.ini 파일에 접근 할 수 없는 경우에는 php의 ini_set() 함수를 사용하시면 됩니다

ex) ini_set("session.save_path" , "./sessions/")





SESSION 사용하기



그럼이제 사용법을 알아보도록 하겠습니다.


1. 세션 시작


세션 혹은 세션변수를 사용하기 위해서는 사용전에 반드시 session_start() 로 세션을 시작해줘야합니다.


PHP

<?php session_start(); ?>


이 함수와 함께 세션이 시작되는 순간 우리 브라우저에는 PHPSESSID 란 이름의 쿠키가 생성됩니다.

세션 설정 정보의 session.name 값을 변경하지 않으면 기본적으로 쿠키명은 PHPSESSID 입니다.

이 때 생성되는 쿠키의 값은 세션이 시작될 때 내부적으로 생성된 유일한 식별자입니다. ID라고 칭하겠습니다.

세션은 쿠키로 저장된 이 ID 값을 통해 세션을 찾습니다. 쿠키가 생성됨과 동시에 우리 서버에는 sess_ID값 이름으로 된 session 파일이 생성됩니다.

따로 지정해 주지 않을 경우 상단의 설정 정보 설명의 session.save_path 에서 지정된 경로 하위에 생성됩니다.


주의사항: session_start() 함수는 헤더데이터를 전송하기 때문에 함수를 사용하기 이전에 화면에 출력되는 어떠한 코드도 있어서는 안됩니다.


이렇게, 파일과 쿠키가 생성되면 우리는 세션을 사용할 수 있습니다.


2. 세션 저장


로그인이라고 가정하고 사용자의 이름과 아이디를 세션변수에 저장해봅시다.


PHP

<?php session_start(); $_SESSION["user_id"] = $user_id; $_SESSION["user_name"] = $user_name; ?>



이렇게 저장된 세션변수는 session_start() 되는 곳 어디서든 사용이 가능하게 됩니다! (쿠키와 서버의 파일이 둘다 삭제되지 않는 다는 가정하에)


3. 세션 삭제


마지막으로 세션을 삭제 하는 부분입니다.

사실 세션을 확실히 삭제 하고자하면, 세가지 절차가 필요합니다.


PHP

<?php $_SESSION = array(); //1. 세션변수초기화 if(isset($_COOKIE[session_name()]) ) { setcookie(session_name(), '', time() -3600, "/"); } //2. 쿠키삭제 session_destroy(); //3. 세션데이터삭제 ?>


먼저, 세션변수를 초기화 합니다.

session_destroy() 함수는 서버의 세션파일을 삭제해주지만, $_SESSION 변수까지 초기화 시켜주지는 못합니다.

예를들어 아래와같이, 세션을 $_SESSION 변수에 저장한 후, session_destroy() 한 후, 세션변수를 출력해보면, 저장된 내용이 초기화 되지 않고 그대로 나오는 것을 볼 수 있습니다.


PHP

<?php session_start(); $_SESSION["user_id"] = $user_id; $_SESSION["user_name"] = $user_name; session_destroy(); //3. 세션데이터삭제 print_r($_SESSION); ?>


물론, 다른페이지에서 session_start() 로 다시 세션을 시작해 사용할 경우, 식별자(ID) 쿠키 값이 남아있어도 서버의 파일데이터가 삭제 되었기 때문에 해당 값을 찾을 수 없습니다.

하지만 세션을 시작한 페이지와 현재 페이지가 같다면 $_SESSION 변수 안에 값이 그대로 남아있겠죠!!

그러므로 초기화 시켜주도록 합시다!


두번째로, 쿠키를 삭제합니다.

session_name() 함수로 쿠키의 ID를 가져와서 쿠키를 삭제하도록 합니다.

쿠키를 삭제 하지 않는 경우, session_start() 하는 경우 PHPSESSID로 저장된 쿠키 식별자를 읽어와 파일을 찾으려 시도합니다.

불필요한 행위는 하지않도록 해주는게 좋겠지요!


마지막으로 세션데이터를 파괴합니다.(sess_xxxx 파일 삭제)

session_destroy() 함수로 session_start() 되는 시점에 등록된 식별자 값에 대한 세션데이터를 서버에서 모두 삭제합니다.

session_destory() 로 세션을 폐기해주지 않으면, 세션정보 파일이 서버에 계속 쌓이게 됩니다.

물론 일정 시간이 지난 세션은 서버가 데이터를 폐기하기도 하지만, 이 시간을 짧게 설정할 수록 서버의 부하가 늘어납니다.

session_destroy() 함수를 사용해 명시적으로 폐기시켜주도록 합시다!




php


[PHP] PHP 에서 move_uploaded_file 실패하는 경우


PHP 에서 move_uploaded_file 을 사용해서 서버에 파일업로드를 하려고 할 때, 기존에 이미 설정한 폴더가 아닌 새로운 폴더에 업로드 하고자하면 파일 업로드가 안되곤 합니다.

이 경우, 파일용량 제한때문이 아니라면 주로 리눅스 서버에서 해당 폴더의 권한이 제대로 설정되어 있지 않을 확률이 높습니다.


FTP 등이 아닌 웹 환경에서 파일업로드를 해야하는 경우, 사용자 본인이 아닌 아파치에게 쓰기 권한이 설정되어있어야 합니다.




서버에서 원하는 폴더에 권한을 757 (rwxr-xrwx) 로 설정해주거나,


Bash(CentOS)

[root@ upload_dir]# chmod 757 mingcho[디렉토리경로]


사용하는 툴에서 CHMOD 기능이 있는 경우 변경해주면 됩니다.



물론 변경 후에는 기타사용자에게 쓰기 권한이 주어지기 때문에, 무분별한 파일이 업로드 되지 않도록 확장자검사, 특수문자검사 등의 방어조치를 취해야합니다.


마지막으로 변경된 폴더로 업로드 해봅시다아.

사실은 move_uploaded_file 함수는 업로드개념보다는 함수명그대로 서버의 tmp 폴더 내부에 임시로 저장된 파일을 내가 원하는 경로로 이동시키는 함수입니다.


PHP

<?php define("UPLOAD_PATH", "/images/"); $tmp_name = $_FILES["name_attr"]["tmp_name"]; //임시저장된 파일을 $target = UPLOAD_PATH.time().$_FILES["name_attr"]["name"]; // /images/1210123112upload_file.jpg move_uploaded_file($tmp_name, $target); //저장 찰칵찰칵 ?>




php


[PHP] PHP 문자열 큰따옴표(") 와 작은따옴표(') 의 차이점



PHP 에서 문자열 작성시에는 아래와 같이 큰따옴표("") 나, 작은따옴표('')를 사용하여 표현합니다.


<?php $a = "double quote"; $b = 'single quote'; ?>


무분별하게 사용하기도 하지만 문자열사용시 큰따옴표("") 와 작은따옴표('')를 사용하는 것은 PHP 내부적으로 차이가 있습니다.





PHP는 문자열을 다룰 때 큰따옴표 안의 문자열의 경우 변수를 찾아내는 과정을 거칩니다.

반면, 작은 따옴표 안의 문자열의 경우 순수 문자열로 인식하여 그대로 보여주게 됩니다.


<?php $text = " 입니다"; echo "double quote $text"; //실행결과 : double quote 입니다. echo 'single quote $text'; //실행결과 : single quote $text ?>


위 예제의 경우 큰따옴표("") 안의 문자열에 사용한 변수는 변수의 값이 제대로 적용 된 데 반해, 작은따옴표('') 안의 변수는 그대로가 문자로 표현되었습니다.


큰따옴표("") 와 작은따옴표('') 의 차이는 변수의 처리 뿐만아니라 확장문자 의 처리에서도 존재합니다.

줄을 개행시켜주는 개행문자 \n 의 경우 큰따옴표안에서는 개행문자로 인식하지만, 작은 따옴표안해서는 일반 문자열로 인식됩니다.


<?php echo "double quote \n"; //실행결과 : double quote echo 'single quote \n'; //실행결과 : single quote \n ?>


위와 같이 작은따옴표 안에서는 대부분의 확장문자가 문자열로 인식되기때문에, 확장문자를 써야하는 경우 큰따옴표("")를 써야합니다.

단, 예외적으로 \' 나 \\ 의 경우 작은따옴표('') 안에서도 사용가능합니다.


<?php echo "사용가능 확장문자 \'"; //실행결과 : 사용가능 확장문자 \' echo '사용가능 확장문자 \''; //실행결과 : 사용가능 확장문자 ' ?>


위의 경우 큰따옴표("") 안에서는 \' 가 문자열로 처리된 반면, 작은따옴표('') 안에서는 확장문자로 처리되었습니다.

상황에 맞게 잘 사용하도록합시다!




+ Recent posts

티스토리 툴바