PEP 268 – HTTP 확장 기능과 WebDAV
- Author:
- Greg Stein <gstein at lyra.org>
- Status:
- Rejected
- Type:
- Standards Track
- Created:
- 20-Aug-2001
- Python-Version:
- 2.x
- Post-History:
- 21-Aug-2001
번역·라이선스 안내
이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판
거부 공지
이 PEP는 거부되었습니다. 제안된 이후 6년 동안 충분한 커뮤니티 지지를 얻지 못했습니다.
초록
이 PEP는 Python의 HTTP 지원을 위한 새로운 모듈과 확장된 기능을 다룹니다. 특히 인증된 요청, 프록시 지원, 인증된 프록시 사용, WebDAV 기능의 추가를 다룹니다.
근거
Python은 “배터리 포함”이라는 포지셔닝 덕분에 상당한 인기를 얻어 왔습니다. 가장 많이 사용되는 프로토콜 중 하나인 HTTP(RFC 2616 참조)는 수년 동안 Python에 포함되어 왔습니다(httplib). 그러나 이 지원은 많은 HTTP 기반 애플리케이션과 시스템의 필요와 요구 사항을 모두 따라잡지 못했습니다. 또한 WebDAV와 XML-RPC 같은 HTTP 기반의 새 프로토콜이 유용해지고 있으며 사용도 점점 늘어나고 있습니다. 이 기능을 제공하면 Python의 “배터리 포함” 역할을 충족할 수 있으며, Python이 새로운 기술의 최전선에 계속 머무를 수 있습니다.
인증과 프록시 지원은 Python의 핵심 HTTP 처리에서 빠져 있는 매우 두드러진 두 가지 기능이지만, Python의 URL 처리(urllib와 urllib2)의 일부로 최소한으로 다뤄지고 있습니다. 그러나 세밀하거나 정교한 HTTP 처리가 필요한 애플리케이션은 이 기능들이 urllib 안에 있는 한 이를 활용할 수 없습니다. 이 기능들을 HTTP 연결과 직접 연관될 수 있는 위치로 리팩터링하면 urllib과 정교한 애플리케이션 모두에서 그 유용성이 높아질 것입니다.
이 PEP는 여러 사람이 이 기능들을 직접 요청하고 SourceForge에 여러 기능 요청이 올라온 데서 비롯되었습니다. 제공할 모듈의 정확한 형태와 사용할 클래스/아키텍처는 논쟁의 대상이 될 수 있으므로, 이러한 논의의 구심점을 제공하고자 이 PEP를 작성했습니다.
명세
표준 라이브러리에 httpx (HTTP 확장 기능)와 davlib (WebDAV 라이브러리) 두 모듈이 추가됩니다.
[ 모듈 이름에 대한 제안을 환영합니다. davlib에는 어느 정도 선례가 있지만, webdav 같은 이름이 바람직할 수도 있습니다 ]
HTTP 인증
httpx 모듈은 HTTP 인증(프록시 인증과 원 서버 인증 모두)을 수행하는 믹스인을 제공합니다. 이 믹스인(httpx.HandleAuthentication)은 HTTPConnection 및 HTTPSConnection 클래스와 결합할 수 있습니다(이 믹스인은 HTTP 및 HTTPS 호환성 클래스와도 동작할 수 있지만, 이는 필수 요건이 아닙니다).
믹스인은 인증 과정을 하나 이상의 “인증기(authenticator)” 객체에 위임하므로, 여러 연결이 인증기를 공유할 수 있습니다. 별도의 객체를 사용하면 인증 시스템(예: LDAP)과의 연결을 장기간 유지할 수 있습니다. Basic 및 Digest 메커니즘(RFC 2617 참조)을 위한 인증기가 제공됩니다. 사용자가 제공한 인증기 서브클래스를 등록하여 연결에서 사용할 수 있습니다.
“자격 증명(credentials)” 객체(httpx.Credentials)도 믹스인과 연관되며, 인증기에 필요한 자격 증명(예: 사용자 이름과 비밀번호)을 저장합니다. 추가 정보(예: NT 도메인)를 담기 위해 Credentials의 서브클래스를 만들 수 있습니다.
이 믹스인은 getresponse() 메서드를 재정의하여 401 (Unauthorized) 및 407 (Proxy Authentication Required) 응답을 감지합니다. 이러한 응답이 발견되면 응답 객체, 연결, 자격 증명이 응답에 지정된 인증 방식에 해당하는 인증자에게 전달됩니다(응답에 여러 방식이 포함되어 있으면 여러 인증자를 보안 수준이 높은 순서대로 시도합니다). 각 인증자는 응답 헤더를 검사하여 올바른 인증 헤더와 함께 요청을 다시 보낼지, 그리고 어떻게 보낼지 결정할 수 있습니다. 어떤 인증자도 인증을 성공적으로 처리하지 못하면 예외가 발생합니다.
적절한 자격 증명과 함께 요청을 다시 보내는 것은 인증 시스템에서 비교적 어려운 부분 중 하나입니다. 어려움은 원래 보낸 내용, 즉 요청 줄, 헤더, 본문을 기록하는 데서 생깁니다. putrequest, putheader, endheaders를 재정의하면 본문을 제외한 모든 것을 가로챌 수 있습니다. endheaders 메서드가 호출되면, 본문 내용을 보관하기 위해 (다음 putrequest 메서드 호출 전까지) send()에 대한 모든 호출을 가로챕니다. 믹스인에는 이런 방식으로 보관할 데이터 양에 대한 설정 가능한 제한이 있습니다(예: 본문 내용을 최대 100k까지만 보관). 본문 전체가 저장되었다면, 적절한 인증 정보와 함께 요청을 다시 보낼 수 있습니다.
본문이 너무 커서 저장할 수 없으면 getresponse()는 단순히 401 또는 407 오류를 나타내는 응답 객체를 반환합니다. 인증 정보는 이미 계산되어 (Credentials 객체에; 아래 참조) 캐시되어 있으므로, 호출자는 요청을 다시 생성하기만 하면 됩니다. 믹스인이 적절한 자격 증명을 첨부합니다.
“보호 공간(protection space)”(RFC 2617 1.2절 참조)은 호스트, 포트, 인증 영역(realm)으로 이루어진 튜플로 정의됩니다. 요청을 HTTP 서버에 처음 보낼 때는 인증 영역을 알지 못합니다(영역은 인증이 실패했을 때만 반환됩니다). 하지만 URL에서 얻은 경로는 가지고 있으며, 이는 서버에 보낼 자격 증명을 결정하는 데 유용할 수 있습니다. Basic 인증 방식은 일반적으로 계층적으로 구성됩니다. 즉, /path에 대한 자격 증명을 /path/subpath에 시도할 수 있습니다. Digest 인증 방식은 계층적 구성을 명시적으로 지원합니다. httpx.Credentials 객체는 여러 보호 공간에 대한 자격 증명을 저장하며, 두 가지 방법으로 조회할 수 있습니다.
(host, port, path)를 사용하여 조회 – 이 조회 방식은 인증 영역을 알지 못하는 경로에 대한 요청을 생성할 때 사용됩니다.(host, port, realm)을 사용하여 조회 – 이 메커니즘은 Request-URI가 특정 영역 안에 있다고 서버가 지정한 경우 인증 과정에서 사용됩니다.
HandleAuthentication 믹스인은 putrequest()를 재정의하여, 자격 증명이 있으면 자동으로 삽입합니다. 사용할 적절한 인증 정보를 결정하는 데에는 putrequest의 URL이 사용됩니다.
또한 믹스인이 두 벌의 자격 증명을 사용하고 저장한다는 점에 유의해야 합니다. 한 벌은 사용될 수 있는 프록시를 위한 것이고, 다른 한 벌은 대상 오리진 서버를 위한 것입니다. 프록시에는 경로가 없으므로, 프록시 자격 증명의 보호 공간은 경로를 통한 저장과 조회에 항상 “/”를 사용합니다.
프록시 처리
httpx 모듈은 프록시를 사용하여 HTTP(S) 작업을 수행하기 위한 믹스인을 제공합니다. 이 믹스인(httpx.UseProxy)은 HTTPConnection 및 HTTPSConnection 클래스와 결합할 수 있습니다(이 믹스인이 HTTP 및 HTTPS 호환성 클래스와도 동작할 수 있지만, 필수 요구 사항은 아닙니다).
믹스인은 사용할 프록시의 (host, port)를 기록합니다. XXX는 연결에 이 호스트/포트 조합을 사용하고, 요청 URL을 오리진 서버를 가리키는 absoluteURI로 다시 쓰도록 재정의됩니다(이 URI들은 프록시 서버로 전달됩니다).
사용자가 HTTP(S)Connection을 직접 사용하여 프록시와 통신할 수도 있으므로, 프록시 인증은 httpx.HandleAuthentication 클래스가 처리합니다.
WebDAV 기능
davlib 모듈은 WebDAV를 지원하는 서버에 WebDAV 요청을 보내기 위한 믹스인을 제공할 것입니다. 이 믹스인(davlib.DAVClient)은 HTTPConnection 및 HTTPSConnection 클래스와 결합할 수 있습니다(이 믹스인은 HTTP 및 HTTPS 호환성 클래스와도 동작할 수 있지만, 이는 필수 요건이 아닙니다).
이 믹스인은 HTTP가 RFC 2616에서, WebDAV가 RFC 2518에서 정의한 다양한 HTTP 메서드를 수행하는 메서드를 제공합니다.
207 (Multi-Status) 응답을 디코딩하는 데에는 사용자 정의 응답 객체가 사용됩니다. 이 응답 객체는 표준 라이브러리의 xml 패키지를 사용하여 multistatus XML 정보를 파싱하고, multistatus 데이터를 담는 간단한 객체 구조를 생성할 것입니다. 여러 파싱 방식을 속도가 빠른 순서대로 시도하고 사용할 것입니다.
참조 구현
실제(향후/최종) 구현은 승인되어 메인 Lib 디렉터리로 옮겨지기 전까지 /nondist/sandbox/Lib 디렉터리에서 개발되고 있습니다.
참고 문헌
Copyright
This document has been placed in the public domain.