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

Python 개선 제안 한국어 번역

PEP 546 – ssl.MemoryBIO와 ssl.SSLObject를 Python 2.7로 백포트하십시오.

Author:
Victor Stinner <vstinner at python.org>, Cory Benfield <cory at lukasa.co.uk>
BDFL-Delegate:
Benjamin Peterson <benjamin at python.org>
Status:
Rejected
Type:
Standards Track
Created:
30-May-2017
Python-Version:
2.7
Post-History:
23-May-2017
Resolution:
Python-Dev message

Table of Contents

번역·라이선스 안내

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

초록

Python 2.7의 전반적인 보안을 강화하기 위해 Python 3의 ssl.MemoryBIO 및 ssl.SSLObject 클래스를 Python 2.7로 백포트합니다.

거부 통지

이 PEP는 거부되었습니다. 근거는 Withdraw PEP 546? Backport ssl.MemoryBIO and ssl.SSLObject to Python 2.7논의를 참조하십시오.

근거

Python 2.7은 지원 종료 예정일(2020년으로 예정됨)에 가까워지고 있지만, 여전히 프로덕션 시스템에서 사용되고 있으며 Python 커뮤니티는 여전히 그 보안에 책임이 있습니다. 이 PEP는 지원되는 모든 Python 버전에서 향후 PEP 543을 도입하는 데 도움이 되며, 이를 통해 Python 2 및 Python 3 사용자 모두의 보안이 향상됩니다.

이 PEP는 Python 2.7에 새로운 기능을 백포트하는 일반적인 예외를 제안하지 않습니다. 백포트를 위해 제안되는 각각의 새로운 기능은 여전히 독립적으로 정당화되어야 합니다. 특히 Python 패키지 색인에서 독립적으로 업데이트되는 백포트에 의존하는 것이 왜 허용 가능한 해결책이 아닌지 설명해야 합니다.

PEP 543

PEP 543은 Python용 새로운 TLS API를 정의하며, OpenSSL을 사용하는 대신 Windows 및 macOS의 네이티브 TLS 구현에 Python 애플리케이션이 액세스할 수 있도록 하여 Python의 보안을 강화합니다. 그 부수 효과로 시스템 신뢰 저장소와 시스템 관리자가 로컬에 설치한 인증서에 액세스할 수 있게 되므로, Python 애플리케이션은 각 애플리케이션을 수정하지 않고도 “회사 인증서”를 사용할 수 있으며 TLS 인증서를 올바르게 검증할 수 있습니다(TLS 인증서 검증을 무시하거나 우회할 필요가 없습니다).

실용적인 이유로 Cory Benfield는 먼저 PEP 543을 위해 ssl.MemoryBIO 및 ssl.SSLObject와 유사한 I/O 없는 클래스를 구현하고, 첫 번째 클래스를 기반으로 소켓 또는 파일 디스크립터를 사용하는 두 번째 클래스를 제공하고자 합니다. 이 설계를 사용하면 더 많은 백엔드를 지원하도록 코드를 구성하고 테스트와 감사를 단순화할 뿐 아니라 구현도 단순화할 수 있습니다. 나중에 성능을 위해 소켓 또는 파일 디스크립터를 직접 사용하는 최적화된 클래스를 추가할 수 있습니다.

API를 정의하는 PEP 543 PEP는 완전하고 우수한 구현을 하나 이상 함께 제공하는 경우에만 의미가 있습니다. 첫 번째 구현은 이상적으로 Python 표준 라이브러리의 ssl 모듈을 기반으로 해야 합니다. 이 모듈은 기본적으로 모든 사용자에게 제공되며 더 대상에 특화된 구현이 없을 때 대체 구현으로 사용할 수 있기 때문입니다.

이 백포트가 수행되지 않으면 사용할 수 있는 유일한 기준 구현은 pyOpenSSL이 됩니다. 그러나 지원되는 모든 버전의 CPython에 함께 제공되는 pip와의 상호 작용 때문에 이는 문제가 됩니다.

requests, pip 및 ensurepip

Requests를 보다 이벤트 루프 중심적인 모델로 전환하는 방안을 검토하려는 계획이 있습니다. Requests 팀은 현재 Python 2.7 지원을 중단하는 것이 가능하다고 생각하지 않으므로, 그렇게 하려면 Twisted나 Tornado를 사용하거나 자체 비동기 추상화를 작성해야 합니다.

비동기 코드에서 MemoryBIO는 래핑된 소켓을 사용하는 것보다 상당한 이점을 제공합니다. 필요한 버퍼링 양을 줄이고, IOCP 기반 리액터와 select/poll 기반 리액터 모두에서 작동하며, 리액터 및 구현 코드도 크게 단순화합니다. 이러한 이유로 Requests는 래핑된 소켓 기반 구현을 사용하는 것을 꺼립니다. Python 2.7로 백포트된 구현이 없으면 Requests는 Twisted와 동일한 해결책을 사용해야 합니다. 즉, pyOpenSSL 에 대한 필수 종속성을 사용해야 합니다.

pip 프로그램은 실용적인 이유로 모든 종속성을 내장해야 합니다. 즉, 다른 설치 방법이 존재한다고 의존할 수 없기 때문입니다. pip는 requests에 의존하므로 pyOpenSSL 사본을 내장해야 한다는 의미입니다. 이는 pip 설치의 사용성을 크게 저하시킵니다. 현재 pip는 각 플랫폼에서 컴파일해야 하므로 C 컴파일러가 필요한 C 확장의 내장을 지원하지 않습니다.

Python 2.7.9부터 Python은 기본 설치와 새 ensurepip 모듈을 통한 가상 환경 사용 모두를 위해 pip 사본을 포함합니다. pip가 결국 PyOpenSSL을 번들로 포함하게 되면 CPython도 결국 PyOpenSSL을 번들로 포함하게 됩니다. ssl.MemoryBIOssl.SSLObject만 백포팅하면 pyOpenSSL을 포함할 필요를 피할 수 있으며, 부트스트랩 문제(python -> ensurepip -> pip -> requests -> MemoryBIO)도 해결할 수 있습니다.

Requests는 Python 2.7 지원을 중단하기 전까지는 자연스럽게 이벤트 루프 모델로 전환할 필요가 없으므로, 이 상황은 PEP 543의 도입 장벽보다는 문제가 적습니다. 그러나 Requests(및 pip)가 Python 2를 계속 지원하는 동안 asyncio와 asyncawait 키워드를 모두 수용하기는 더 어려워집니다.

기타 이점입니다.

이 PEP를 채택하면 생태계에 다른 소규모 이점도 생깁니다. 예를 들어 Twisted는 서드파티 C 확장에 대한 의존성을 줄일 수 있습니다. 또한 PyOpenSSL 개발 팀은 이 모듈을 단계적으로 폐기하고자 하며, 이 백포트를 통해 사용자들을 곤경에 빠뜨리지 않고도 우아한 방식으로 이를 진행할 여유를 얻게 됩니다.

이러한 부수적인 이점은 각각 규모는 작지만 더 광범위한 Python 생태계에도 가치를 제공합니다.

우려 사항입니다.

사람들은 이 백포트에 대해 몇 가지 우려를 제기합니다.

구버전 Python 2는 어떻습니까?

전 세계의 Python 2 사용자 중 상당수는 Python 2 릴리스의 발전 속도를 따라가지 못하고 있습니다. 이는 대개 Python 2의 마이너 릴리스 속도를 따라가지 못하는 LTS 릴리스를 사용하고 있기 때문입니다. 이러한 사용자는 MemoryBIO를 사용할 수 없으므로, Python 2 호환성을 중시하는 프로젝트는 대부분 사용자 시스템에 MemoryBIO가 존재한다고 의존하지 못할 수 있습니다.

이러한 우려는 타당합니다. 그 우려가 얼마나 중요한지는 현재 Python 2 사용자가 Python 3으로 마이그레이션할 가능성 또는 단순히 최신 Python 2 릴리스를 사용하려 할 가능성에 따라 달라집니다. 달리 말하면, 언젠가는 라이브러리가 Python 2 지원을 중단하려 할 것이며, 문제는 그 전에 Python 2 사용자 중 상당수가 이 백포트를 포함하는 Python 2 릴리스로 이미 이동했는지 여부뿐입니다.

궁극적으로 이 PEP의 작성자들은 이러한 우려에도 불구하고 백포팅을 정당화할 만큼 이 백포트의 부담이 충분히 작다고 생각합니다. 더 새로운 2.7 릴리스로의 마이그레이션이 너무 느린 것으로 드러난다면 이 작업의 가치는 작겠지만, 마이그레이션이 어느 정도 합리적인 속도로 진행된다면 상당한 가치를 얻게 됩니다.

변경 사항입니다.

Python 2.7의 ssl 모듈에 MemoryBIOSSLObject 클래스를 추가합니다.

코드는 마스터 브랜치(Python 3)에서 백포팅하고 조정합니다.

또한 이 백포트는 _ssl 모듈에서 Python 2와 Python 3 간 차이의 규모를 크게 줄여 유지보수를 더 쉽게 합니다.

링크입니다.

논의