requests는 사실 두 개의 층(layer)로 나뉜다.
하나는 requests.get(), requests.post()같은 매우 쉽고 인간 친화적인 API이다.
둘은 urllib3(하위 레벨): 실제 네트워크 연결, 연결 풀링(Connection Pooling), 재시도(Retry), 타임아웃 등 복잡하고 지저분한 저수준(Low-level)작업을 처리하는 라이브러리이다.
requests는 urllib3를 내부적으로 사용하여, 복잡한 네트워킹을 숨기고 사용자에게 깔끔한 인터페이스만 제공한다.