Cookie , Session 이란?

2010/07/09 08:33

Cookie ,Session 이란?

PHP 에서 가장 많이 사용되고 흔이 접하는게 Session 입니다. 오늘은 Session 에 대해서 이야기 해보도록 하겠습니다.HTTP 는 클라이언트(사용자)가 접속한것을 확인을 할수 있는 방법은 없습니다. 왜냐 하면 HTTP 1번 데이터를 전송하고 연결이 종료가 되는 형태의 프로토콜입니다. 지속적인 연결이 아니라는 것이죠 , 그래서 사용자를 구별하기 위해서 Cookie를 사용했습니다. Cookie 는 사용자 브라우저에 저장을 하는 방식입니다.

Cookie의 저장 방식
Cookie 는 서버 Response 헤더에 Set-Cookie 값에 따라 브라우저가 로컬 저장소에 값을 저장하는 방식입니다. 특정 값을 클라이언트에 저장을 하고 다음 요청때 다시 그 값을 Request 헤더에 담아 전송을 하여 "내가 누구고 값은 어떤것을 가지고 있다" 라고 서버에 다시 알려주는 형태입니다. 그런데 이 방식에서 약간의 문제점이 있었습니다. 물론 개발 하는 사람이 Cookie에 사용자에 대한 개인정보를 담아 전송을 하면 브라우저는 그 개인정보를 컴퓨터에 저장한다라는 것이죠 이 과정에서 저장된 Cookie값을 가로채 소중한 개인정보를 다른사람이 알아 차릴수 있다는 점에서 Cookie는 문제점이 발견되었습니다. 그래서 새롭게 Session 이라는 것이 생겨난것입니다.

Session 의 저장 방식
Session 은 Cookie와 동일하게 HTTP 서버에서 클라이언트(사용자)를 알아볼수 있는 방법(도구) 입니다. Session은 사용자를 식별 할수 있는 최소한의 Cookie값을 브라우저에 보냅니다. 이것은 Session ID라는 값이죠 웹 서핑을 하다보면 브라우저 주소창에 sessionid=... 형태의 값이 바로 Session ID 입니다. 물론 전부 동일한 이름을 가지는 것은 아니고 형태 또한 매우 불규칙 할 수 있습니다. 이 세션 아이디는 브라우저에서 서버에 간단하게 값을 던지고 HTTP 서버는 그 값을 이용해 서버에 값이 저장됩니다. 이 방식을 사용하면 클라이언트 측 Cookie를 누가 본다고 해도 전혀 어떤 내용인지 알수가 없죠, 서버에만 값을 저장하기 때문입니다. ^^

Session 의 동작 순서
Session동작 순서에 대해서 알아보겠습니다. (간단하게 브라우저와 HTTP 서버 사이에 동작입니다.)

1. 클라이언트가 서버에 접속을 시도 합니다.
2. 서버는 클라이언트가 세션 아이디를 보내왔는지 확인합니다.
3. 세션 아이디가 없다면 세션 아이디를 생성 하여 Respons Header 의 Set-Cookie: 를 통해 보냅니다.
4. 클라이언트는 서버에서 받은 Set-Cookie: 을 클라이언트 PC에 저장합니다.
5. 서버는 Session ID에 해당하는 파일, 메모리 , 또는 특정 방법으로 사용자 데이터를 저장,이용합니다.
6. 클라이언트가 접속을 종료하거나, Session ID를 담고 있는 Cookie를 제거 한다면 서버에도 삭제를 합니다.

한 사이트를 지속적으로 이용을 할때 1~5를 반복적으로 수행합니다.

위 방법으로 Session 을 이용하는 것입니다. 최소한의 값으로 클라이언트를 식별할 수 있는 것이죠~

HTTP 프로토콜 호출 구조

2009/04/24 09:05
HTTP 프로토콜 , http protocol, 웹 전송 구조, 웹 서버구조,웹 강좌 웹서버 호출 RFC 2616 RFC2616 웹 프로토콜 구조 web protocol

RFC 문서에 나오는 구체적인 데이터 통신 방법을 말하는것이 아닌 사이트 스크래핑이나 웹 데이터를 이용하려 할때 또는 외부에서 사이트 내용을 사용할때 이용될 수 있는 간단한 HTTP 프로토콜 호출 구조이다. (편의상 존칭은 생략했습니다 ^^)
참고 문서 HTTP RFC(영문)

클라이언트 A 가 서버 B에 연결을 해서 test.html 을 받아오는 과정을 설명한다.

HTTP 호출 구조 이미지 출처(Wikipedia)

HTTP 프로토콜 호출 구조

1. URL 분석
2. 도메인 해석
3. 서버 접속
4. Request Header 전송
5. Request Data 전송 (옵션)
6. Response Header 수신
7. Response Body 수신
8. 연결 종료

위와 같은 구조로 HTTP 호출이 이루어진다 자세하게 보자면

예제 URL : http://www.testsitexxx.com:8080/test.html

1. URL 분석


브라우저에서 URL을 분석을 하게 된다 , 우리가 입력한 URL을 분석하여 프로토콜,호스트, 서버 포트, 호출 파일 등을 분석하게 된다.

일단 프로토콜(scheme라고도함) 을 분석하게 되는데 여기서 설명하게 될 부분은 HTTP이기때문에 그외의 프로토콜은 제외한다. http 와 https 등 호출하게되는 프로토콜이 있다. 위 예제 url에서는 http 이다.

그리고 호스트를 분석한다.위 url에서 호스트는 www.testsitexxx.com 이다.

서버 포트는 8080 포트를 이용을 한다. 기본으로는 80 포트를 이용하게 된다. 80포트는 HTTP의 예약된 포트번호이다.
경로는 / 이며 호출될 파일은 test.html 을 호출한다.

2. 도메인 해석


브라우저에서 서버에 접속을 할때는 도메인을 IP 주소로 변환하는 과정이 필요하다. DNS서버에 질의를 하여 호스트명을 IP주소로 반환한 값을 얻어와 해당 IP주소와 포트로 접속을 하게 된다. TCP 접속 방식 및 접속 구조에 대해서는 다음에 다루기로 한다.

3. 서버 접속


DNS서버에서 질의한 결과에 따른 IP와 URL에서 해석된 포트명으로 서버에 접속을 하게된다.

4. Request Header 전송


일반적으로 사이트를 호출할때는 아래와 같은 형태의 Request Header가 존재 한다.

GET(요청방식*1) /test.html(경로*2) HTTP/1.1(프로토콜버전*3)
Accept: */* (응답하여 해석할 파일의 종류*4)
Referer: (호출전경로*5)
User-Agent: (브라우저의 Agent값*7)
Accept-Encoding: gzip, deflate (수신가능한 body 인코딩 종류*8)
Host: (호출할 호스트*9)

Request Header 설명

헤더 기본 설명 펼치기


5. Request Data


POST 방식으로 데이터를 전송할때에 Request Header를 서버로 전송한 후 Request데이터를 보낸다 이 데이터를 보내려면 호출방식(메소드)를 POST로 지정을 한 후 데이터를 전송한다.
데이터를 보내는 방식에는 2가지가 있는데 하나는 form-urlencod 를 통해 보내는 방식 또 하나는 multipart-formdata 를 이용해 보내는 방식이 있다. 이 2가지 방식의 차이점은 전자는 일반적인 폼데이터(텍스트위주)만 전송할때 쓰이는 방식이고 아래 방식은 서버로 파일을 전송할때 사용이 된다.

호출 구조의 변화는 호출 메소드가 POST로 변화하고 전송하는 데이터의 길이를 서버에 알려준다 그리고 해당 데이터를 요청 폼에 맞게 전송을 하게 된다

URL Encoded 로 전송
Content-Type: application/x-www-form-urlencoded
Content-Length: XX

xxx=XXX&yyy=YYY


Multi Part Form-data 로 전송 (파일 전송시)
Content-Type: multipart/form-data; boundary=--------[boundaryKEY값]
Content-Length: XX 보낼 데이터의 전체적인 길이

--------[boundaryKEY값]
Content-Disposition: form-data; name="폼이름"; filename="파일이름"
Content-Type: 파일의 MIME 타입

파일 내용

--------[boundaryKEY값]
Content-Disposition: form-data; name="폼이름"

데이터
--------[boundaryKEY값]

위와같이 POST데이터를 전송한다

6.Response Header (응답헤더)



HTTP/1.1 200 OK
Server: Apache
Content-Length: xx
Transfer-Encoding: 데이터 인코딩의 타입
Content-Type: text/html; charset=utf-8
응답받은 헤더의 내용은 위와 같은 형태로 나타난다 헤더의 전체적인 응답데이터는 RFC문서를 참고하거나 추후 포스팅을 하겠다. 이부분은 서버가 HTTP/1.1방식으로 응답을 했다는 내용이다. 그리고 오류코드는 200 즉 정상으로 응답을 했다는 표시이고
전송하는 컨텐츠의 길이는 XXByte이다고 알려준다. Contents-Type 은 text/html 이고 그 데이터의 캐릭터셋은 utf-8이라는것을 브라우저에게 알려준다.

7. Response Body
응답헤더가 출력되고 CRLF가 2번 나온 후 HTTP Body(html body 아님) 가 출력이 되는데 이 것은 응답헤더의 인코딩 타입에 따라 달라지게 된다. 보통 gzip, chunked 인코딩이 사용된다.

인코딩 자세히 보기


편의상 존칭을 생략했습니다. ^^ 틀린 부분이나 보기 힘든 부분 있으면 말씀해주세요 ^^
그리고 RFC문서를 전체적으로 적는다기 보다 HTTP의 구조를 이해를 돕기 위해 적었습니다.

[PHP 강좌] 2. 상수, 변수

2009/02/27 08:15

1. 상수
PHP 에서 상수의 사용은 아래와 같습니다.

define('상수명', '값');

상수는 스크립트 내의 값을 치환합니다. 그리고 스크립트 실행 중에는 변경될 수 없습니다.  즉 상수는 환경 설정이나 기타 중요하지만 변경되지 않고 자주 사용되는것을 사용할 수 있습니다. 예를 들어서 ROOT 디렉토리를 자주 접근하게 된다면 디렉토리 경로를 상수로 지정할 수 있습니다.

상수의 표현은 문자나 밑줄로 시작하고 대소문자는 구별됩니다.
define('ROOTDIR', '/home/userhome/public_html/');

include(ROOTDIR . 'Lib/Classname.class.php');

위와 같이 사용하면 ROOTDIR 스크립트 실행시 "/home/userhome/public_html" 으로 치환이 되어 스크립트가 실행됩니다.

그리고 전역적인 속성으로 어느 스크립트 안에서도 참조 할 수 있습니다.

2. 변수
PHP에서 변수는 말그대로 변형가능한 값을 말합니다.
변수는 C , Java 처럼 변수의 형을 선언하지 않습니다. 변수의 사용은 아래와 같습니다.
$var1 = 123; // 정수 123 $var2 = '123'; // 문자열 123 $var3 = $var1 + $var2; // 변수의 연산 echo $var3; // 246

[PHP 강좌] 1. PHP의 시작

2009/02/26 18:09

PHP 의 시작

PHP 는 웹 스크립트 언어 로서 웹 페이지 안에서 동작을 하도록 되어 있습니다.

웹 페이지 안에 "Hello World!" 를 찍어 보겠습니다. (너무 식상하지만 그래도 ^^)

<?
	echo 'Hello World!'; // 화면에 Hello World!를 출력합니다.
?>

TAG ,

[PHP 강좌] PHP 를 배워 봅시다.

2009/02/26 18:05

PHP 란 ?

PHP
(정식 명칭 "PHP: Hypertext Preprocessor")는 범용성을 지닌 널리 사용되는 오픈 소스 스크립트 언어입니다. 특히, 웹 개발 및 HTML에 포함하기에 적합합니다.

설치 및 사용
웹 계정을 생성 하거나 또는 Apache Web Server, PHP, MySQL 을 설치 또는 통합 패키지 APM_SETUP http://www.apmsetup.com/ 으로 이용할 수 있습니다.

설치는 설치 편에서 자세하게 다루도록 하겠습니다 .


작성 : 이근원 (2009/02/26)