소프트웨어 인터페이스

웹 클라이언트

웹 API

미국 인구 조사에서 네덜란드 국립 도서관에 이르기까지 거의 모든 웹사이트에서 API를 제공하며, 이를 통해 사용자가 데이터를 받거나 공유할 수 있도록 한다. 트위터나 페이스북과 같은 일부 서비스에서는 여러분(혹은 여러분이 사용하는 앱)이 데이터를 수정할 수 있도록 지원한다. RESTful API라는 용어를 들어본 적이 있을 것이다. RESTful API는 표준도, 프로토콜도, 요구사항도 아닌, HTTP 1.1이 어떻게 설계되었는지를 알려주는 패러다임이다. 그럼에도 불구하고 대부분의 웹 서비스 API 공급자는 RESTful 디자인 원칙을 따른다.

JSON 파싱

JSON은 말 그대로 자바스크립트에서 객체를 정의하는데 사용하는 표기법이다. Requests 라이브러리의 Response 객체에는 내장 JSON 파서가 있다. json 라이브러리는 JSON 형식의 문자열이나 파일을 파이썬 딕셔너리로 파싱한다. 역으로 파이썬 딕셔너리 혹은 리스트를 JSON 문자열로 바꿀 수도 있다.

웹 스크래핑

웹사이트의 데이터가 언제나 CSV나 JSON과 같은 편안한 형식으로 제공되지는 않는다. 그러나 HTML 역시 구조화된 데이터이기에 웹 스크래핑이 가능하다. 웹 스크래핑은 컴퓨터 프로그램을 사용해 웹페이지를 탐색하고 필요한 데이터를 가장 유용한 형식에 맞춰 수집하고, 그러한 데이터 구조를 보존하는 작업을 일컫는다.

lxml

lxml은 XML과 HTML 문서를 매우 빠르게 파싱하기 위해 만들어진 다기능 라이브러리로 올바르지 않은 형식의 마크업까지도 일부 처리할 수 있다.

데이터 직렬화

데이터 직렬화란 구조화된 데이터를 공유하거나 저장할 수 있는 형식으로 변환하는 개념이며, 데이터 객체를 재구축하는 데 필요한 정보를 전송의 수신단 메모리에 보존한다. 경우에 따라 직렬화된 데이터의 크기를 최소화하여 디스크 필요 공간 혹은 대역폭 요구 정도를 최소화하는 것이 목적이 되기도 한다.

피클

파이썬 기본 데이터 직렬화 모듈은 피클이라 불린다.

언어 간 직렬화

만약 여러 언어를 지원하는 직렬화 모듈을 찾고 있따면, 인기 있는 두 가지 선택지로 구글의 프로토버프와 아파치의 에이브로가 있다.

버퍼 프로토콜

파이썬 핵심 개발자 중 한 명인 엘리 벤데르스키는 ‘메모리 버퍼를 사용해 파이썬이 만드는 동일 데이터에 대한 인메모리 복사본 개수를 줄이는 방법’을 다루는 글을 작성해 블로그에 올렸다. 그의 기법에 따르면, 파일이나 소켓을 기존의 버퍼로 불러올 수 있다.

분산 시스템

네트워킹

파이썬에서는 전역 인터프리터 잠금(Global Interpreter Lock, GIL)의 단일 스레드 한계를 극복하기 위해, 주로 비동기 도구나 스레드를 사용해 연결 네트워크용 통신을 처리한다.

파이썬 표준 라이브러리의 성능 네트워킹 도구

asyncio

asyncio는 파이썬 3.4에서 소개되었으며, Twisted와 gevent를 유지 보수하는 개발자 커뮤니티로부터 배운 아이디어가 녹아 있다. 동시성 도구이며, 주로 네트워크 서버에 사용한다.

gevent

gevent는 코루틴 기반의 파이썬 네트워킹 라이브러리이며, 그린릿을 사용하여 C 라이브러리 이벤트 루프 위에 하이레벨의 동기식 API를 제공한다.

Twisted

Twisted는 이벤트 기반 네트워킹 엔진이다. HTTP와 서버 및 클라이언트를 포함한 각종 네트워킹 프로토콜, SMTP, POP3, IMAP같은 이메일 프로토콜, SSH, 인스턴스 메시징을 사용한 다양한 애플리케이션을 만들 수 있다.

PyZMQ

PyZMQ는 ZeroMQ를 위한 파이썬 바인딩이다.

RabbitMQ

RabbitMQ는 AMQP(Advanced Message Queing Protocol)을 구현한 오픈 소스 메시지 브로커 소프트웨어다. 메시지 브로커는 중간 프로그램으로, 프로토콜에 따라 발신자로부터 메시지를 전달 받아 수신자에게 전송한다.

pika

pika는 RabbitMQ가 선호하는, 경량의 순수 파이썬 AMQP 0-9-1 클라이언트이다. RabbitMQ의 파이썬 입문 튜토리얼에서 pika를 사용한다.

Celery

Celery는 기능이 한층 더 많은 AMQP 클라이언트이다. RabbitMQ나 레디스(Redis, 분산 인메모리 데이터 저장소)를 메시지 브로커로 사용할 수 있으며, 작업과 결과를 추적할 수 있고, 웹 관리자 도구이자 작업 모니터링 도구인 Flower가 포함되어 있다.

암호

2013년에 PyCA가 구성되었다. 이들은 파이썬 커뮤니티에 고품질의 암호 라이브러리를 제공하는 데 관심이 있는 개발자 모임이다. 이들은 적절한 키가 주어졌을 때 메시지를 암호화하거나 해독하는 도구를 제공하고, 암호나 기타 비밀 데이터를 비가역 방향으로 난독화하는 암호화 해시 함수를 제공한다.

ssl, hashlib, secrets

  • ssl

    • 파이썬 표준 라이브러리의 ssl 모듈은 표준 소켓처럼 행동하는 소켓 API를 제공한다. 그러나 이 API는 SSL 프로토콜, 그리고 SSL 연결 구성을 포함하는 ssl.SSLContext에 의해 래핑된다.
  • hashlib

    • 파이썬의 hashlib 모듈은 보안 저장소를 위한 해시 암호를 생성하는 데 사용할 수 있다. 전송 도중 데이터 무결성을 확인하기 위한 체크섬을 생성하는 데 사용할 수도 있다.
  • secrets

    • secrets 라이브러리는 PEP 506에서 제안되어 파이썬 3.6에서 도입되었다. 보안 토큰을 생성하기 위한 함수를 제공하며, 암호 초기화와 추측하기 어려운 URL 생성과 같은 분야에 적합하다.

pyOpenSSL

Cryptography 라이브러리가 공개되었을 때, pyOpenSSL은 OpenSSL 라이브러리를 위한 Cryptography의 CFFI 기반 바인딩을 사용하도록 업데이트되었고, PyCA의 우산 안에 합류하였다. pyOpenSSL은 파이선 표준 라이브러리와는 별도로 존재하므로, 보안 커뮤니티의 속도에 맞춰 업데이트를 배포할 수 있다.

PyNaCl과 libnacl

PyNaCl과 libnacl의 C 라이브러리 백엔드인 libsodium의 아이디어는 의도적으로 사용자에게 다양한 선택을 제공하지 않고, 상황별 최적 선택만 제공하는 것이다. 모든 TLS 프로토콜을 지원하지는 않으니, TLS 프로토콜이 필요하다면 pyOpenSSL을 사용하자. 직접 관리하는 다른 컴퓨터와의 암호화된 연결이 필요하고, 여기에 원하는 프로토콜을 사용하고 싶다면 libsodium을 사용하자.

Cryptography

Cryptography는 암호화 레시피와 기본 요소를 제공한다. 파이썬 2.6에서 2.7까지, 그리고 파이썬 3.3 이상, PyPy를 지원한다. Cryptography는 레시피와 hazmat의 두 레이어로 나뉜다. 레시피 레이어는 적절한 대칭 암호화를 위한 간단한 API문서를 제공하며, hazmat 레이어는 로우 레벨의 암호화 기본 요소를 제공한다.

PyCrypto

PyCrypto는 안전한 해시 함수와 다양한 암호화 알고리즘을 제공한다. 파이썬 2.1 이상의 버전과 파이썬 3을 지원한다.

bcrypt

암호에 bcrypt 알고리즘을 사용하고 싶다면 이 라이브러리를 사용하자. py-bcrypt와 호환되기 때문에 py-bcrypt를 사용하던 사람이 옮겨오기 좋다.