묻고답하기
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
앳플군님께...
2004.05.29 21:00
정말 감사합니다.
삽질하기전에 앳플군님의 글을봤더라면 이해를 못했을텐데,지금은 어느정도 이해가 가군요.
진짜 제가 바란게 스킬도 좋지만 누가 개념좀 이해시켜줬으면 했는데 딱 개념을 아주 쉽게 이해시켜주는군요.
너무 감사해서 눈물이 납니다.
늦은 나이에 프로그래밍이라는거에 취미를 붙여서 한참 재미를 붙여가는 중입니다.
앳플군님 정식으로 제 질문했던부분 관련만 수업을 받을수없을까요?
전화상이든 메신저 상이든..당연히 보답은 하겠습니다.
저에게 공부좀 알켜주십시요.
귀찮게 안하고요 길잡이만 해주십시요.너무 무리한 부탁일런지 모르겠습니다.
제 부탁을 안들어주셔도 오늘 질문에 대한 답변 너무 소중하고 고맙습니다.
무슨일이든 잘되기를 진심으로 빕니다.그럼...
삽질하기전에 앳플군님의 글을봤더라면 이해를 못했을텐데,지금은 어느정도 이해가 가군요.
진짜 제가 바란게 스킬도 좋지만 누가 개념좀 이해시켜줬으면 했는데 딱 개념을 아주 쉽게 이해시켜주는군요.
너무 감사해서 눈물이 납니다.
늦은 나이에 프로그래밍이라는거에 취미를 붙여서 한참 재미를 붙여가는 중입니다.
앳플군님 정식으로 제 질문했던부분 관련만 수업을 받을수없을까요?
전화상이든 메신저 상이든..당연히 보답은 하겠습니다.
저에게 공부좀 알켜주십시요.
귀찮게 안하고요 길잡이만 해주십시요.너무 무리한 부탁일런지 모르겠습니다.
제 부탁을 안들어주셔도 오늘 질문에 대한 답변 너무 소중하고 고맙습니다.
무슨일이든 잘되기를 진심으로 빕니다.그럼...
댓글 5
-
좋은만남
2004.05.30 14:03
-
좋은만남
2004.05.29 21:06
-
앳플군
2004.05.29 22:20
일단, 엔지오를 예로 들어보겠습니다.
웹 브라우저는 이런 헤더를 보냅니다.
GET / HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Accept-Language: ko
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: www.nzeo.com
Connection: Keep-Alive
(fsockopen 해서 보내는 내용이죠?)
그러면, 서버가 이런 내용을 보냅니다.
HTTP/1.1 200 OK
Date: Sat, 29 May 2004 12:45:39 GMT
Server: Apache/1.3.27 (Unix) PHP/4.2.3
X-Powered-By: PHP/4.2.3
Set-Cookie: PHPSESSID=933453b5bf40be04b57484a381784225; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
P3P : CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC"
Content-Encoding: gzip
Vary: Accept-Encoding
Content-Length: 6098
Connection: close
Content-Type: text/html
여기서, "Set-Cookie: PHPSESSID=933453b5bf40be04b57484a3817842**; path=/" 부분에 주목하시기 바랍니다.
그리고, 커뮤니티 채널로 가기 위해 커뮤니티 채널 버튼을 눌렀습니다.
GET /?channel=community HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Referer: http://www.nzeo.com/
Accept-Language: ko
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: www.nzeo.com
Connection: Keep-Alive
Cookie: PHPSESSID=933453b5bf40be04b57484a3817842**
잘 보시면, 요청 헤더에 "Cookie: PHPSESSID=933453b5bf40be04b57484a3817842**" 부분이 추가된 것을 볼 수 있으실 겁니다. "Set-Cookie: PHPSESSID=933453b5bf40be04b57484a3817842**; path=/" 부분에서 정해준 세션값과 같습니다. (뒤에 붙은 "path" 부분은, 보안과 관련된 부분입니다.)
즉, 쿠키는 서버의 편의를 위해, 클라이언트에게 "다음 접속부터는 이런이런 쿠키값을 같이 보내달라" 는 것이고, 서버에서는 이 쿠키값을 가지고 사용자를 구분합니다.
그런데, 엔지오의 경우는 약간 다릅니다. 엔지오는 개개인의 데이터를 클라이언트의 쿠키 형식이 아닌 서버에 저장합니다. 쿠키는 헤더를 변조할 수 있으므로 보안에 취약합니다만, 서버에 저장되므로 보안성을 강화한 것이라고 보시면 됩니다. 하지만, 그냥 서버에 저장하면 사용자를 알 수 없으니 사용자마다 "세션값" 이라는 고유 아이디를 발급해서 쿠키로 등록합니다. (보통 쿠키를 "굽는다" 는 표현을 씁니다.)
즉, 저의 고유 아이디 (접속시 마다 바뀔 수도 있습니다.) 는 933453b5bf40be04b57484a3817842** (뒤의 **은 일부러 가린겁니다.) 이고, 이것을 서버가 알고 제 정보를 찾아서 그 정보에서 로그인 값을 찾아 인증하는 겁니다.
님은 지금, 이 웹 브라우저가 하는 과정을 그대로 구현하시려고 하는 겁니다.
여기부터
POST /bbs/login_check.php HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Referer: http://www.nzeo.com/bbs/zboard.php?id=p_qa_new&page=1&sn1=&divpage=4&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=21449
Accept-Language: ko
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: www.nzeo.com
Content-Length: 257 (주1: 이 부분은 날릴 문자열의 글자수입니다. 나중에 예제에서 설명)
Connection: Keep-Alive
Cache-Control: no-cache
s_url=%252Fbbs%252Fzboard.php%253Fid%253Dp_qa_new%2526page%253D1%2526sn1%253D%2526divpage%253D4%2526sn%253Doff%2526ss%253Don%2526sc%253Doff%2526select_arrange%253Dheadnum%2526desc%253Dasc%2526no%253D21449&user_id=**YOURID**&password=**YOURPASS**&group_no=1&x=22&y=21
여기까지를 그대로 복사해서 소켓으로 날린 다음에 (fsockopen 해서 보내시듯이 하시면 됩니다.) 결과값을 찍어보세요. (저 **YOURID** 와 **YOURPASS** 부분은 엔지오 아이디/암호로 바꿔서 해보세요.) "Set-Cookie: PHPSESSID=???; path=/" 부분이 있을 겁니다.
그런 다음에,
GET /?channel=community HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*
Referer: http://www.nzeo.com/
Accept-Language: ko
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)
Host: www.nzeo.com
Connection: Keep-Alive
Cookie: PHPSESSID=아까 그 세션값
을 한번 더 날려보세요. "***님, 환영합니다." 메시지가 나올 것입니다.
간단한 예제를 보시면 이해가 더 쉬우실 겁니다. -
앳플군
2004.05.29 22:20
<?php
$id = "아이디";
$pw = "암호";
echo "<pre style='font-family: 굴림체;'>";
// 1. 엔지오에 로그인한다.
$header_content = "s_url=%252Fbbs%252Fzboard.php%253Fid%253Dp_qa_new%2526page%253D1%2526sn1%253D%2526divpage%253D4%2526sn%253Doff%2526ss%253Don%2526sc%253Doff%2526select_arrange%253Dheadnum%2526desc%253Dasc%2526no%253D21449&user_id=".$id."&password=".$pw."&group_no=1&x=22&y=21";
$length = strlen($header_content);
$header = "POST /bbs/login_check.php HTTP/1.1";
$header .= "\r\n"."Accept: */*";
$header .= "\r\n"."Referer: http://www.nzeo.com/bbs/zboard.php?id=p_qa_new&page=1&sn1=&divpage=4&sn=off&ss=on&sc=off&select_arrange=headnum&desc=asc&no=21449";
$header .= "\r\n"."Accept-Language: ko";
$header .= "\r\n"."Content-Type: application/x-www-form-urlencoded";
//$header .= "\r\n"."Accept-Encoding: deflate";
$header .= "\r\n"."User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$header .= "\r\n"."Host: www.nzeo.com";
$header .= "\r\n"."Content-Length: ".$length;
$header .= "\r\n"."Connection: Keep-Alive";
$header .= "\r\n"."Cache-Control: no-cache";
$header .= "\r\n\r\n";
$header .= $header_content;
// 소켓 연결
echo "<b>1. Nzeo.com에 소켓 연결</b>";
echo "\n\n";
echo "날린 HEADER\n";
echo $header;
echo "\n\n";
$fp = fsockopen("www.nzeo.com", 80);
fputs($fp, $header);
while (!feof($fp)) $data .= fgets($fp, 1024);
$fp = fclose($fp);
echo "받은 헤더\n\n";
echo "<xmp>".$data."</xmp>";
echo "\n\n";
// 받아온 헤더에서 ($data) 쿠키값 빼내기
echo "<b>2. 세션값을 빼냅니다.</b>";
echo "\n";
$pattern = "/Set-Cookie: PHPSESSID=([^;]*); path=\\//";
preg_match($pattern, $data, $match);
echo "<b>Session 값: </b>".$match[1];
echo "\n\n";
// Nzeo Community 부분을 불러와 "님 환영합니다" 메시지가 있는 지 확인.
echo "<b>3. Nzeo Community를 호출하면 회원으로 인식할까요?</b>";
echo "\n\n";
$header = "GET /?channel=community HTTP/1.1";
$header .= "\r\n"."Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, */*";
$header .= "\r\n"."Referer: http://www.nzeo.com/";
$header .= "\r\n"."Accept-Language: ko";
//$header .= "\r\n"."Accept-Encoding: deflate";
$header .= "\r\n"."User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)";
$header .= "\r\n"."Host: www.nzeo.com";
$header .= "\r\n"."Connection: Keep-Alive";
$header .= "\r\n"."Cookie: PHPSESSID=".$match[1];
$header .= "\r\n\r\n";
// 소켓 연결
echo "날린 HEADER\n";
echo $header;
echo "\n\n";
$fp = fsockopen("www.nzeo.com", 80);
fputs($fp, $header);
$data = "";
while (!feof($fp)) $data .= fgets($fp, 1024);
$fp = fclose($fp);
echo "받은 헤더\n\n";
echo "<xmp>".$data."</xmp>";
echo "\n\n";
if (preg_match("/님 환영합니다/", $data)) echo "<b>회원으로 인식하네요!</b>"; else echo "<b>어디서 뭔가 잘못되었군요.</b>";
?>
여기서, Accept-Encoding: gzip, deflate 부분을 뺀 것은, 저 헤더를 삽입할 경우 gzip 사용 가능한 브라우저로 인식해, 텍스트를 압축해서 보내기 때문입니다. -
앳플군
2004.05.29 22:23
Content-Length 부분은, POST 형식으로 서버에 보낼 때, 보낼 문자열의 길이를 적는 부분입니다.
예제를 보니깐 이해가 확확 오네요.
사용자가 도메인을 치고 홈페이지가 보이기까지 어떻게 구동되는지 앳플군님때문에 이해가 옵니다.저에게 이런 개념을 잡아줘서 정말 고맙습니다.
앳플군님 소스를 오늘부터 당장 파야겠습니다.조금 어려운부분도 있지만 기어코 삽질하여 성공을 꼭 해보겠습니다. 성공을 하든 실패를 하든 다음에 또 글남기겠습니다.
그때도 앳플군님이 꼭 봐주었으면 합니다.
앳플군님 진심으로 감사드립니다.