gdg dev camp 발표자료 - python으로 만들어보는 http서버

Post on 14-Apr-2017

487 Views

Category:

Technology

9 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Python 으로 만들어보는 HTTP 서버

강성일 (Luavis) |luaviskang@gmail.comb. 1995 Seoul, KR

Junior Software EngineerWeb Front/Back-end / iPhone Developer / Emebed DeveloperTechnical ToolsPython, Swift, PHP, JavaScript(Node.JS/React), Objective-C, HTML, Linux, C, TCP socket, MariaDB, NGINX, flask, AVR, Freescale, ...Professional Experience• Freelancer Aug, 2015 to now • iPhone Developer, Feb, 2014 to Aug, 2014, Hoit company – Seoul, KR Achievement• Korea Olympiad in Informatics, in 2013• Hanyang univ, Smart car competition in 2015

Research Papers• Lane Detection and Tracking Based on Line Scan Camera in Autonomous Driving Miniature Vehicle, 2015

Education• Soongsil Univ, Since 2014 – Seoul, KR

In college of Electronic Engineering• SW Maestro 6th, 2015 - 2016 – Seoul, KR• Korea Digital Media High school, 2011 - 2013 – Ansan, KR

Major in Web-promgramming

선수지식

Python Socket

Python 으로 만들어보는 HTTP 서버

Flask

배경

Codelab

Python 으로 만들어보는 HTTP 서버

Python 을 이용해서 어떻게 HTTP 서버를 만들까

배경

HTTP 의 구조 / HTTP2이걸 Python 으로 짜둔소스 조금 설명 ?

기본 지식

HTTP

TCP/IP

여기부터는사실상하드웨어

기본 지식

HTMLHyper Text Markup Language

기본 지식

Hyper TextTransfer하이퍼 텍스트를 옮기는

Protocol프로토콜

기본 지식

Request

Client Server

Response

Request

Request

Request packet

POST / HTTP/1.1Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip, deflate, sdchAccept-Language:ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4,ja;q=0.2Cache-Control:max-age=0Connection:keep-aliveHost:www.w3.orgReferer:https://www.google.co.kr/User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36

search=google&utf-8=&page=10

Packet 구조

Packet 구조 Request packet

POST / HTTP/1.1Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip, deflate, sdchAccept-Language:ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4,ja;q=0.2Cache-Control:max-age=0Connection:keep-aliveHost:www.w3.orgReferer:https://www.google.co.kr/User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36

search=google&utf-8=&page=10

Request packet

POST / HTTP/1.1Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip, deflate, sdchAccept-Language:ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4,ja;q=0.2Cache-Control:max-age=0Connection:keep-aliveHost:www.w3.orgReferer:https://www.google.co.kr/User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36

search=google&utf-8=&page=10

Packet 구조

Packet 구조 Request packet

POST / HTTP/1.1Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8Accept-Encoding:gzip, deflate, sdchAccept-Language:ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4,ja;q=0.2Cache-Control:max-age=0Connection:keep-aliveHost:www.w3.orgReferer:https://www.google.co.kr/User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36

search=google&utf-8=&page=10

Request packet

POST / HTTP/1.1Method

Path

Version

Method

GET

HEAD

POST

PUT

DELETE

TRACE

OPTIONS

CONNECT

PATCHGeneral usage

POST / HTTP/1.1Method

Path

Version

Method

GET

HEAD

POST

PUT

DELETE

TRACE

OPTIONS

CONNECT

PATCHRestful usage

POST / HTTP/1.1Method

Path

Version

Method

GET

HEAD

PUT

DELETE

OPTIONS

CONNECT

자료를 요청

자료의 존재 요청

POST TRACE자료 업로드

자료 수정

자료 삭제

서버 확인

가능한 메소드 확인

PATCH부분적 수정

Path

POST / HTTP/1.1Method

Path

Version

Path

https://www.pycon.kr/2016apac/about/coc/

Path

/2016apac/about/coc/https:// www.pycon.kr프로토콜

도메인

Path( 경로 )

Versions

- Berners-Lee first proposed the "WorldWideWeb" project in 1989. - The first documented version of HTTP was HTTP V0.9 (1991).

- Dave Raggett led the HTTP Working Group (HTTP WG) in 1995. - RFC 1945 officially introduced and recognized HTTP V1.0 in 1996.

- The HTTP/1.1, RFC 2068 was officially released in January 1997

정리해보면

GET /2016apac/about/coc/ HTTP/1.1자료 요청

이런 경로에 있는걸

HTTP 1.1 프로토콜로

Response

Response

Packet 구조 Response packet

HTTP/1.1 200 OKContent-Language:enContent-Location:O-HTTP-charset.en.phpContent-Type:text/html; charset=UTF-8Date:Tue, 19 May 2015 15:23:39 GMTP3P:policyref="http://www.w3.org/2014/08/p3p.xml"Server:Apache/2TCN:choiceTransfer-Encoding:chunkedVary:negotiate,accept-language

<html><p>hello World</p></html>

Packet 구조 Response packet

HTTP/1.1 200 OKContent-Language:enContent-Location:O-HTTP-charset.en.phpContent-Type:text/html; charset=UTF-8Date:Tue, 19 May 2015 15:23:39 GMTP3P:policyref="http://www.w3.org/2014/08/p3p.xml"Server:Apache/2TCN:choiceTransfer-Encoding:chunkedVary:negotiate,accept-language

<html><p>hello World</p></html>

Packet 구조 Response packet

HTTP/1.1 200 OKContent-Language:enContent-Location:O-HTTP-charset.en.phpContent-Type:text/html; charset=UTF-8Date:Tue, 19 May 2015 15:23:39 GMTP3P:policyref="http://www.w3.org/2014/08/p3p.xml"Server:Apache/2TCN:choiceTransfer-Encoding:chunkedVary:negotiate,accept-language

<html><p>hello World</p></html>

Packet 구조 Response packet

HTTP/1.1 200 OKContent-Language:enContent-Location:O-HTTP-charset.en.phpContent-Type:text/html; charset=UTF-8Date:Tue, 19 May 2015 15:23:39 GMTP3P:policyref="http://www.w3.org/2014/08/p3p.xml"Server:Apache/2TCN:choiceTransfer-Encoding:chunkedVary:negotiate,accept-language

<html><p>hello World</p></html>

Response packet

HTTP/1.1 200 OKStatus codeVersion

Status Code

For example

Status Code

100 200 300 400 500

Status Code Informational 1xx

100 Continue서버는 이 코드를 제공하여 요청의첫 번째 부분을 받았으며 나머지를 기다리고 있음을 나타낸다 .

101 Switching Protocols서버에 프로토콜 전환을 요청했으며서버는 이를 승인하는 중이다 .

Status Code 200 OK이는 주로 서버가 요청한 페이지를 제공했다는 의미로 쓰인다 .

201 Created서버가 새 리소스를 작성했다 .

202 Accepted접수했지만 아직 처리하지 않았다 .

203 Non-Authoritative Information다른 소스에서 수신된 정보를 제공하고 있다 .

204 No Content처리했지만 콘텐츠를 제공하지 않는다 .

Successful 2xx

Status Code

300 Multiple Choices서버가 사용자 에이전트에 따라 수행할 작업을 선택하거나 ,요청자가 선택할 수 있는 작업 목록을 제공한다 .

301 Moved PermanentlyGET 또는 HEAD 요청에 대한 응답으로이 응답을 표시하면 요청자가 자동으로 새 위치로 전달된다 .

302 Found요청자는 향후 요청 시 원래 위치를 계속 사용해야 한다 .

304 Not Modified마지막 요청 이후 요청한 페이지는 수정되지 않았다 .

307 Temporary Redirect현재 서버가 다른 위치의 페이지로 요청에응답하고 있지만 요청자는 향후 요청 시원래 위치를 계속 사용해야 한다 .

Redirection 3xx

Status Code

400 Bad Request서버가 요청의 구문을 인식하지 못했다 .

401 Unauthorized서버는 로그인이 필요한 페이지에대해 이 요청을 제공할 수 있다 .

404 Not Found서버가 요청한 페이지를 찾을 수 없다 .

405 Method Not Allowed요청에 지정된 방법을 사용할 수 없다 .

408 Request Timeout서버의 요청 대기가 시간을 초과하였다 .

413 Request Entity Too Large요청이 너무 커서 서버가 처리할 수 없다 .

Client Error 4xx

Server Error 5xxStatus Code

500 Internal Server Error서버에 오류가 발생하여 요청을 수행할 수 없다 .

501 Not Implemented서버에 요청을 수행할 수 있는 기능이 없다 .

502 Bad Gateway서버가 게이트웨이나 프록시일때 ,업스트림 서버에서 잘못된 응답을 받았다 .

503 Service Unavailable서버가 오버로드되었거나 유지관리를 위해 다운됨 .

504 Gateway Timeout서버가 게이트웨이나 프록시일때 ,응답을 제때 못 받았다 .

505 HTTP Version Not Supported사용된 HTTP 프로토콜 버전을 지원안함 .

Header

Header

HeaderAcceptAccept-CharsetAccept-FeaturesAccept-EncodingAccept-LanguageAccept-RangesAccess-Control-Allow-CredentialsAccess-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Max-AgeAccess-Control-Expose-HeadersAccess-Control-Request-MethodAccess-Control-Request-Headers

If-None-MatchIf-RangeIf-Unmodified-SinceLast-Event-IDLast-ModifiedLinkLocationMax-ForwardsNegotiateOriginPragmaProxy-AuthenticateProxy-AuthorizationRangeRefererRetry-AfterSec-Websocket-ExtensionsSec-Websocket-KeySec-Websocket-OriginSec-Websocket-ProtocolSec-Websocket-Version

ServerSet-CookieSet-Cookie2Strict-Transport-SecurityTCNTETransfer-EncodingUpgradeUser-AgentVariant-VaryVaryViaWarningWWW-AuthenticateX-Content-DurationX-Content-Security-PolicyX-DNSPrefetch-ControlX-Frame-OptionsX-Requested-With

AgeAllowAlternatesAuthorizationCache-ControlConnectionContent-EncodingContent-Language

Content-LengthContent-LocationContent-MD5Content-RangeContent-Security-PolicyContent-TypeCookieDate

ETagExpectExpiresFromHostIf-Match

HeaderAcceptAccept-CharsetAccept-FeaturesAccept-EncodingAccept-LanguageAccept-RangesAccess-Control-Allow-CredentialsAccess-Control-Allow-OriginAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Max-AgeAccess-Control-Expose-HeadersAccess-Control-Request-MethodAccess-Control-Request-Headers

If-None-MatchIf-RangeIf-Unmodified-SinceLast-Event-IDLast-ModifiedLinkLocationMax-ForwardsNegotiateOriginPragmaProxy-AuthenticateProxy-AuthorizationRangeRefererRetry-AfterSec-Websocket-ExtensionsSec-Websocket-KeySec-Websocket-OriginSec-Websocket-ProtocolSec-Websocket-Version

ServerSet-CookieSet-Cookie2Strict-Transport-SecurityTCNTETransfer-EncodingUpgradeUser-AgentVariant-VaryVaryViaWarningWWW-AuthenticateX-Content-DurationX-Content-Security-PolicyX-DNSPrefetch-ControlX-Frame-OptionsX-Requested-With

AgeAllowAlternatesAuthorizationCache-ControlConnectionContent-EncodingContent-Language

Content-LengthContent-LocationContent-MD5Content-RangeContent-Security-PolicyContent-TypeCookieDate

ETagExpectExpiresFromHostIf-Match

Header

Server : 어떤 서버 프로그램의 정보를 클라이언트에게 제공

Host : 요청하는 도메인을 제공ex) Server: nginx/1.7

ex) Host: www.example.comLocation : Moved 일 경우 이동할 주소를 제공

ex) Location: www.example.com

ex) Date: Wed, 15 Nov 1995 06:25:24 GMTDate : 서버의 시간을 제공

Header

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

클라이언트가 서버에게 받을 수 있는 파일의 형식 정의

Header

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

MIME TYPE

Header

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8

format;quality=0.90.0 ~ 1.0

Header

Accept-Charset: iso-8859-5, unicode-1-1;q=0.8

ASCII, EUC-KR, EUC-JP, CP949, UTF-8…

Header

ISO 639-1 Code: ko-kr, en-us, en-gb, ja-jp, zh-cn, zh-tw…

Accept-Language: ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3

클라이언트가 서버에게 받을 수 있는 언어의 종류를 보냄

Header

Accept-Encoding: gzip, deflate, sdch

클라이언트가 서버에게 가능한 자신이 해석 가능한 압축방법을 제시함

Header Accept-Encoding: gzip, deflate, sdch

클라이언트가 서버에게 가능한 자신이 해석 가능한 압축방법을 제시함compress – UNIX "compress" program methoddeflate – compression based on the deflate algorithm, wrapped inside the zlib data formatexi – W3C Efficient XML Interchangegzip – GNU zip format. This method is the most broadly supportedidentity – No transformation is used. This is the default value for content coding.pack200-gzip – Network Transfer Format for Java Archives.bzip2 – compression based on the free bzip2 format, supported by lighttpdlzma – compression based on (raw) LZMA is available in Opera 20, and in elinks via a compile-time optionpeerdist – Microsoft Peer Content Caching and Retrievalsdch – Google Shared Dictionary Compression for HTTP, based on VCDIFF.xz - LZMA2-based content compression, supported by a non-official Firefox patch.

Header

Content-Encoding: gzip

서버가 클라이언트에게 보내는 내용의 압축방식을 알려줌

Header

Content-Encoding: gzip

서버가 클라이언트에게 보내는 내용의 압축방식을 알려줌

Header

Content-Type: text/html; charset=utf-8

서버가 클라이언트에게 보내는 내용의 type 을 알려줌

Header

Content-Length: 23021

보내는 내용의 크기를 바이트 단위로 알려줌

HTTP 2

HTTP 2

HTTP 2

엄청난 진보= 전체 페이지 사이즈 증가

In 1998 google

Now google

HTTP 2

HTTP 2

• 훨씬 더 많은 리소스로 구성되어 있다 .

• 다수의 도메인을 사용한다 .

• 과거에 비해 매우 동적으로 동작한다 .

• 보안이 보다 중요한 이슈가 되었다 .

• 헤더의 길이가 길어졌다 .

HTTP 2

HPACK / Binary Protocol Server Push

Multiplexing

HTTP 2 장점

WSGI

WSGI

PEP 333 / PEP 3333

WebApplication

HandlerClient

Examples

Examples

https://github.com/Luavis/GDG-Devcamp-2016

https://git.io/v61jO

or

Referenceshttp://nuli.navercorp.com/sharing/blog/post/1132452https://www.maxcdn.com/blog/spdy-http2-shift/http://cacm.acm.org/magazines/2012/12/157870-spdying-up-the-web/abstracthttp://www.slideshare.net/oddpoet/spdy-13231459http://helloworld.naver.com/http://www.w3.org/http://wikipedia.org/http://wpcertification.blogspot.kr/2010/07/difference-between-no-cache-and-no.htmlhttp://icecreamie.tistory.com/52http://www.mobify.com/blog/beginners-guide-to-http-cache-headers/

Thanks!감사합니다 !http://fb.com/luavis

http://github.com/Luavishttp://luavis.kr

top related