Python/2.7 information

파이썬 소켓 기본.

qkqhxla1 2014. 8. 10. 15:28

urllib2나 urllib, httplib은 기본은 다룬것 같고, 소켓 시작하도록 하겠습니다.

소켓 프로그래밍을 하려면 http요청 헤더 구조를 잘 아는게 '매우매우매우' 중요합니다..

단순히 요청 헤더를 잘못 썼다는 이유만으로 답변이 안 올 수도 있기 때문이죠...

한번 읽어보고 아래 글 읽으시길 바랍니다.

http://blog.naver.com/cptcho/110021031351

http://blog.naver.com/eqelizer/20134185046

전부 다 어떤 역할을 하는지, 어떻게 쓰는지는 몰라도 되지만 이런 헤더가 있다, 이런 헤더는 이런곳에

쓰인다 정도는 알아두셔야 될 것 같습니다. 예로 이번 코드게이트 2014때

Range헤더에 관한 문제가 나왔었죠.... 일단 중요한 부분중 하나는 Host부분입니다.

제가 링크한 글에 들어가서 읽어보면 반드시 포함되어야 하는 헤더라고 나와있죠.. 요청을 보낼 시에

Host부분이 없으면 답변이 안 오기 때문에 반드시 있어야 합니다.

코드로 설명하겠습니다..

import socket

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) #여기서 소켓을 만듭니다. socket.socket은 소켓 인스턴스를 만들겠다는 뜻이고, 
#내부의 AF_INET은 ipv4주소체계, SOCK_STREAM은 TCP소켓을 만들겠다는 뜻입니다. 무슨소리이신지 모르겠으면 네트워크 공부하셔야 해요... 
#DOCS를 링크 걸겠습니다 참조하세요. https://docs.python.org/2.7/library/socket.html?highlight=socket#socket

s.connect(('webhacking.kr',80)) #여기서는 webhacking.kr에 연결하는데 80번 포트로 연결하겠다는 의미입니다. 
#반드시 괄호가 두개씩 있어야 해요. 왜그래야 하는지는 docs찾아보세요.

session = "e1uavrvlg351a9vf1s8fcenuv1" #제가 가져온 webhacking.kr의 유효한 세션입니다.

message = """GET /index.php HTTP/1.1
Host: webhacking.kr
Cookie: PHPSESSID="""+session+"""\n\n""" #나중에 따로 설명 하겠습니다. 반드시 소켓으로 보낼 메시지 끝을 두줄내려줘야 해요.

s.sendall(message) #위에서 만들어진 소켓 인스턴스의 sendall메소드로 보낼 메시지를 직접 보냅니다.

print s.recv(2000) #보내고 나서 받은 답을 recv메소드로 출력합니다. 내부의 인자는 몇글자를 출력할건지(영문자 기준) 적어놓은거에요.

보낼 message부분에 대해서 자세히 설명 하겠습니다. message부분을 구성하는데 반드시 필요한 

부분인 GET /index.php HTTP/1.1 과 Host부분과 Cookie부분을 가져옵니다. 

GET은 GET방식, /index.php는 index.php페이지를 요청, HTTP/1.1은 HTTP버전을 뜻합니다. Host는

앞에서 말했듯이 반드시 필요한 부분이고, Cookie는 로그인을 증명하기 위해 필요한 부분입니다.

위에 제가만든 message는 이렇게 이루어졌고, 중요한 부분은 빨간색으로 표시한 \n\n부분입니다.

끝부분에 \n\n가 없으면 답이 오지 않습니다. HTTP헤더는 두 줄을 기점으로 헤더와 BODY내용을

구분하기 때문에 반드시 끝에 \n\n으로 두줄을 내려줘야 합니다. 원래는 \r\n\r\n처럼 캐리지 

리턴이 하나 더 붙어있지만 캐리지 리턴은 없어도 상관없습니다.


\n\n이 없는 코드. 요청을 보내도 무한루프를 도는것처럼 답이 안온다.



\n\n이 있는 코드. 제대로 답변이 옵니다.

이외에도 다른 문제가 있을시 똑같이 무한루프를 돌 수 있습니다......

*2016-02-08 추가.

위의 소켓프로그래밍에서는 기본적으로 필요하다고 했던 host와 cookie등만 포함시켰고, 그래도 됬지만 요즘의 일반적인 웹사이트에서는 referer라던지, user agent의 형식이라던지 등 다른 것들도 검사를 해서 형식이 틀리다고 하면(ex) user agent가 없어서 구글 봇이라고 착각하는 경우.) 답변을 안 주는 경우도 있습니다. 그럴때는 제대로 요청이 오는 패킷 전부를 캡쳐한 후 한 라인씩 지워나가면서 어떤 라인이 이 웹사이트에 필요한지 알아나가시면 되겠습니다.


일단 오늘은 이걸로 끝내겠습니다. 소켓 프로그래밍은 소켓 그 자체가 필요하다기보다는

웹적으로 보면 HTTP요청 헤더 구조 분석과, 또 시스템이나 웹적으로 소켓이 필요한 경우를 대비한 

프로그래밍이라고 생각하시면 됩니다.