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를 정의합니다. 이 API는 Python 애플리케이션이 OpenSSL을 사용하는 대신 Windows와 macOS의 네이티브 TLS 구현에 접근할 수 있게 하여 Python의 보안을 강화합니다. 그 부수 효과로 시스템 신뢰 저장소와 시스템 관리자가 로컬에 설치한 인증서에 접근할 수 있게 됩니다. 따라서 Python 애플리케이션은 각 애플리케이션을 수정하지 않고도 “회사 인증서”를 사용할 수 있고, (TLS 인증서 검증을 무시하거나 우회하는 대신) TLS 인증서를 올바르게 검증할 수 있습니다.

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

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

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

requests, pip 및 ensurepip

Requests를 좀 더 이벤트 루프 중심의 모델로 옮기는 방안을 검토하려는 계획이 진행 중입니다. Requests 팀은 현재로서는 Python 2.7 지원을 포기할 수 없다고 판단하므로, 이를 위해서는 Twisted나 Tornado를 사용하거나 자체 비동기 추상화를 작성해야 합니다.

비동기 코드에서 MemoryBIO는 래핑된 소켓을 사용하는 것에 비해 상당한 이점을 제공합니다. 수행해야 하는 버퍼링의 양을 줄이고, select/poll 기반 리액터뿐만 아니라 IOCP 기반 리액터에서도 동작하며, 리액터와 구현 코드를 크게 단순화합니다. 이러한 이유로 Requests는 래핑된 소켓 기반 구현을 사용하기를 꺼립니다. Python 2.7로의 백포트가 없으면, Requests는 Twisted와 같은 해결책, 즉 pyOpenSSL에 대한 필수 의존성을 사용할 수밖에 없습니다.

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

Python 2.7.9부터 Python은 새로운 ensurepip 모듈을 통해 기본 설치용과 가상 환경용으로 pip 사본을 내장합니다. pip가 결국 PyOpenSSL을 번들로 포함하게 되면 CPython도 결국 PyOpenSSL을 번들로 포함하게 됩니다. ssl.MemoryBIO와 ssl.SSLObject만 백포트하면 pyOpenSSL을 내장할 필요가 없어지고, 부트스트랩 문제(python -> ensurepip -> pip -> requests -> MemoryBIO)도 해결됩니다.

당연히 Requests는 Python 2.7 지원을 중단하기 전에 이벤트 루프 모델로 전환할 필요가 없으므로, 이 상황은 PEP 543의 도입 장벽보다는 문제가 덜합니다. 하지만 이 상황 때문에 Requests(그리고 pip)는 Python 2를 계속 지원하는 한 asyncio와 async와 await 키워드를 모두 받아들이기가 어려워집니다.

기타 이점

이 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 릴리스로의 이전이 너무 느린 것으로 드러나면 이 작업의 가치는 미미하겠지만, 더 새로운 2.7 릴리스로의 이전이 어느 정도라도 합리적인 속도로 이루어진다면 상당한 가치를 얻게 될 것입니다.

변경 사항

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

코드는 master 브랜치(Python 3)에서 백포트하여 수정할 것입니다.

또한 이 백포트는 _ssl 모듈의 Python 2/Python 3 간 차이를 크게 줄여 유지 보수를 더 쉽게 해 주었습니다.

링크

논의