Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 개선 제안 한국어 번역

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

Table of Contents

번역·라이선스 안내

이 비공식 한국어 번역은 원문 Copyright 절의 Public Domain 조건에 따라 제공합니다. 원저자와 공식 원문은 그대로 표시합니다. 수정되지 않은 기준 원문 · 공식 최신판

거부 통지

이 PEP는 거부되었습니다. 제안된 지 6년이 지나도록 충분한 커뮤니티 지지를 얻는 데 실패했습니다.

초록

이 PEP는 파이썬의 HTTP 지원을 위한 새로운 모듈과 확장된 기능을 다룹니다. 특히 인증된 요청, 프록시 지원, 인증된 프록시 사용, 그리고 WebDAV기능의 추가를 다룹니다.

근거

파이썬은 “배터리 포함” 지향성 덕분에 상당한 인기를 얻어 왔습니다. 가장 널리 쓰이는 프로토콜 중 하나인 HTTP(RFC 2616 참조)는 수년간 파이썬에 포함되어 왔습니다(httplib). 그러나 이 지원은 많은 HTTP 기반 애플리케이션과 시스템의 전체적인 필요와 요구 사항을 따라잡지 못했습니다. 또한 WebDAV와 XML-RPC 같은 HTTP 기반의 새로운 프로토콜들이 유용해지고 있으며 사용이 늘어나고 있습니다. 이 기능을 제공하는 것은 파이썬의 “배터리 포함” 역할에 부합하며, 동시에 파이썬을 새로운 기술의 최전선에 유지시켜 줍니다.

인증과 프록시 지원은 파이썬의 핵심 HTTP 처리에서 빠져 있는 매우 주목할 만한 두 기능이지만, 파이썬의 URL 처리(urlliburllib2)의 일부로서 최소한으로 다뤄지고 있습니다. 그러나 세밀하거나 정교한 HTTP 처리를 필요로 하는 애플리케이션은 이 기능들이 urllib 안에 머무는 한 이를 활용할 수 없습니다. 이 기능들을 HTTP 연결과 직접 연관될 수 있는 위치로 리팩터링하면 urllib와 정교한 애플리케이션 모두에 대한 유용성이 향상될 것입니다.

이 PEP의 동기는 여러 사람이 이 기능들을 직접 요청한 것과 SourceForge의 다수 기능 요청에서 비롯되었습니다. 제공될 모듈들의 정확한 형태와 사용될 클래스/아키텍처는 논쟁의 여지가 있을 수 있으므로, 이 PEP는 그러한 논의를 위한 구심점을 제공하고자 작성되었습니다.

명세

표준 라이브러리에 httpx (HTTP 확장 기능)와 davlib (WebDAV 라이브러리) 두 모듈이 추가될 예정입니다.

[ 모듈 이름에 대한 제안을 환영합니다; davlib에는 선례가 있지만, webdav와 같은 이름이 바람직할 수도 있습니다 ]

HTTP 인증

httpx 모듈은 HTTP 인증(프록시 인증과 원본 서버 인증 모두)을 수행하기 위한 믹스인을 제공합니다. 이 믹스인(httpx.HandleAuthentication)은 HTTPConnectionHTTPSConnection 클래스와 결합될 수 있습니다(이 믹스인이 HTTP 및 HTTPS 호환성 클래스에서도 동작할 가능성이 있지만, 이는 필수 사항은 아닙니다).

이 믹스인은 인증 과정을 하나 이상의 “인증자(authenticator)” 객체에 위임하여 여러 연결이 인증자를 공유할 수 있도록 합니다. 별도의 객체를 사용하면 인증 시스템(예: LDAP)에 대한 장기적인 연결이 가능해집니다. Basic 및 Digest 메커니즘(RFC 2617 참조)을 위한 인증자가 제공될 예정입니다. 사용자가 제공한 인증자 서브클래스를 등록하여 연결에서 사용할 수 있습니다.

“자격 증명(credentials)” 객체(httpx.Credentials)도 이 믹스인과 연관되어 있으며, 인증자에게 필요한 자격 증명(예: 사용자 이름과 비밀번호)을 저장합니다. 추가 정보(예: NT 도메인)를 담기 위해 Credentials의 서브클래스를 만들 수 있습니다.

이 믹스인은 401 (Unauthorized)407 (Proxy Authentication Required) 응답을 감지하기 위해 getresponse() 메서드를 오버라이드합니다. 이것이 발견되면 응답 객체, 연결, 자격 증명이 응답에 명시된 인증 방식에 대응하는 인증자에게 전달됩니다(응답에 여러 방식이 포함된 경우 보안 수준이 높은 순서대로 여러 인증자를 순차적으로 시도합니다). 각 인증자는 응답 헤더를 검사하여 올바른 인증 헤더로 요청을 재전송할지 여부와 그 방법을 결정할 수 있습니다. 어떤 인증자도 인증을 성공적으로 처리하지 못하면 예외가 발생합니다.

적절한 자격 증명으로 요청을 재전송하는 것은 인증 시스템에서 가장 어려운 부분 중 하나입니다. 이러한 어려움은 원래 전송된 내용, 즉 요청 라인, 헤더, 본문을 기록하는 데서 비롯됩니다. putrequest, putheader, endheaders를 오버라이드함으로써 본문을 제외한 모든 것을 캡처할 수 있습니다. endheaders 메서드가 호출되면, 본문 내용을 보관하기 위해 (다음 putrequest 메서드 호출 전까지) send()에 대한 모든 호출을 캡처합니다. 믹스인은 이러한 방식으로 보관할 데이터 양에 대해 설정 가능한 제한을 가지게 됩니다(예: 본문 내용을 최대 100k까지만 보관). 전체 본문이 저장되었다고 가정하면, 적절한 인증 정보와 함께 요청을 재전송할 수 있습니다.

본문이 너무 커서 저장할 수 없는 경우, getresponse()는 단순히 401 또는 407 오류를 나타내는 응답 객체를 반환합니다. 인증 정보가 이미 계산되어 (Credentials 객체에; 아래 참조) 캐시되어 있으므로, 호출자는 단순히 요청을 다시 생성하기만 하면 됩니다. 믹스인이 적절한 자격 증명을 첨부합니다.

“보호 공간”(RFC 2617 섹션 1.2 참조)은 호스트, 포트, 인증 영역(realm)의 튜플로 정의됩니다. 요청이 HTTP 서버로 처음 전송될 때는 인증 영역을 알 수 없습니다(영역은 인증에 실패했을 때만 반환됩니다). 그러나 URL로부터 얻은 경로는 가지고 있으며, 이는 서버로 보낼 자격 증명을 결정하는 데 유용할 수 있습니다. Basic 인증 방식은 일반적으로 계층적으로 설정됩니다: /path의 자격 증명은 /path/subpath에도 시도될 수 있습니다. Digest 인증 방식은 이 계층적 설정에 대한 명시적인 지원을 제공합니다. httpx.Credentials 객체는 여러 보호 공간에 대한 자격 증명을 저장하며, 두 가지 방법으로 조회할 수 있습니다.

  1. (host, port, path)를 사용하여 조회 – 이 조회 방식은 인증 영역을 알 수 없는 경로에 대한 요청을 생성할 때 사용됩니다.
  2. (host, port, realm)을 사용하여 조회 – 이 메커니즘은 서버가 Request-URI가 특정 영역에 속한다고 명시했을 때, 인증 과정 중에 사용됩니다.

HandleAuthentication 믹스인은 putrequest()를 오버라이드하여 가능한 경우 자격 증명을 자동으로 삽입합니다. putrequest에서 얻은 URL은 사용할 적절한 인증 정보를 결정하는 데 사용됩니다.

또한 두 세트의 자격 증명이 사용되며, 믹스인에 의해 저장된다는 점도 중요합니다. 하나는 사용될 수 있는 프록시를 위한 것이고, 다른 하나는 대상 원본 서버를 위한 것입니다. 프록시에는 경로가 없으므로, 프록시 자격 증명 내의 보호 공간은 경로를 통한 저장 및 조회 시 항상 “/”를 사용합니다.

프록시 처리

httpx 모듈은 HTTP(S) 작업을 수행하기 위해 프록시를 사용하는 믹스인을 제공합니다. 이 믹스인(httpx.UseProxy)은 HTTPConnectionHTTPSConnection 클래스와 결합될 수 있습니다(이 믹스인은 HTTP 및 HTTPS 호환성 클래스에서도 작동할 수 있지만, 이는 필수 사항은 아닙니다).

믹스인은 사용할 프록시의 (host, port)를 기록합니다. XXX는 연결에 이 호스트/포트 조합을 사용하고, 요청 URL을 원본 서버를 가리키는 absoluteURI로 재작성하도록 재정의됩니다(이 URI들은 프록시 서버로 전달됩니다).

사용자가 프록시와 통신하기 위해 HTTP(S)Connection을 직접 사용할 수 있으므로, 프록시 인증은 httpx.HandleAuthentication 클래스에 의해 처리됩니다.

WebDAV 기능

davlib 모듈은 WebDAV를 지원하는 서버로 WebDAV 요청을 보내기 위한 믹스인을 제공합니다. 이 믹스인(davlib.DAVClient)은 HTTPConnectionHTTPSConnection 클래스와 결합할 수 있습니다(이 믹스인은 HTTP 및 HTTPS 호환성 클래스와도 동작할 수 있지만, 이는 필수 요건이 아닙니다).

이 믹스인은 RFC 2616의 HTTP와 RFC 2518의 WebDAV에서 정의된 다양한 HTTP 메서드를 수행하는 메서드를 제공합니다.

207 (Multi-Status) 응답을 디코딩하기 위해 커스텀 응답 객체가 사용됩니다. 응답 객체는 표준 라이브러리의 xml 패키지를 사용하여 멀티스테이터스 XML 정보를 파싱하며, 멀티스테이터스 데이터를 보관하기 위한 간단한 객체 구조를 생성합니다. 여러 파싱 방식이 속도가 빠른 순서대로 시도/사용될 예정입니다.

참조 구현

실제(향후/최종) 구현은 승인되어 메인 Lib 디렉터리로 옮겨지기 전까지 /nondist/sandbox/Lib 디렉터리에서 개발되고 있습니다.

참고 문헌