라이브러리 의존성 보안: pip와 Poetry의 취약점 점검법
오늘 설치한 라이브러리, 정말 안전할까요? 한 줄의 의존성 코드가 전체 시스템을 무너뜨릴 수도 있습니다.
안녕하세요, 개발자 여러분! ICT리더 리치입니다. 파이썬 프로젝트를 진행할 때, 우리는 pip이나 Poetry로 쉽게 외부 라이브러리를 설치하곤 합니다. 하지만 이러한 의존성 관리 도구는 편리함과 동시에 잠재적 보안 위협을 품고 있기도 하죠. 최근 들어 패키지에 악성 코드가 숨겨진 사례들이 늘어나면서, 보안 점검의 중요성이 다시 조명되고 있습니다.
오늘 포스팅에서는 pip과 Poetry를 사용할 때 발생할 수 있는 보안 위협과 이를 사전에 방지하기 위한 점검 및 관리 방법을 실무적인 시각에서 안내해드리겠습니다.
📌 바로가기 목차
| Poetry 사용 중 보안 점검을 수행하는 개발자의 모습 – 파이썬 의존성 보안 대표 이미지 |
1. 의존성 패키지의 보안 위험성 이해
파이썬 프로젝트에서 라이브러리를 설치하는 것은 이제 필수가 되었습니다. 하지만 외부 패키지에 의존하게 되면, 그만큼 보안적인 리스크도 함께 따라옵니다. 특히 PyPI에 올라온 오픈소스 중 일부는 의도치 않은 백도어나 악성 스크립트를 포함할 수 있으며, 특정 버전에서는 이미 알려진 취약점이 존재하는 경우도 많습니다.
개발 초기에는 잘 동작하지만, 나중에 보안감사를 받을 때 문제가 드러나는 사례가 다수 보고되고 있습니다.
2. pip vs Poetry: 보안 측면에서의 차이점
pip과 Poetry는 파이썬 패키지 설치 및 관리를 위한 도구로 널리 사용됩니다. 하지만 이 두 도구는 의존성 처리와 보안 기능에 있어 몇 가지 뚜렷한 차이를 가지고 있습니다.
| 항목 | pip | Poetry |
|---|---|---|
| 의존성 고정 | requirements.txt 수동 관리 | 자동 lock 파일 관리 (poetry.lock) |
| 보안 점검 | 기본 미지원 | 간접 의존성 추적 가능 |
| 서드파티 도구 연동 | pip-audit 등 별도 사용 | 내장 기능 일부 제공 |
3. 취약점 점검 도구 소개 및 실전 활용
보안 강화를 위해 사용할 수 있는 파이썬용 취약점 점검 도구는 다양합니다. 이 중 실무에서 자주 쓰이는 몇 가지 툴을 소개드립니다.
- pip-audit: PyPI 패키지의 보안 취약점을 스캔해주는 CLI 기반 도구
- safety: requirements.txt 기반 패키지에서 취약점 존재 여부를 검사
- bandit: 파이썬 코드의 보안 취약 패턴을 정적 분석하여 탐지
![]() |
| 라이브러리 의존성 보안 - pip와 Poetry 사용 시 주의할 점을 설명하는 인포그래픽 (여성 중심) |
4. 안전한 라이브러리 설치 습관 만들기
의존성 보안을 지키기 위해 가장 먼저 해야 할 일은 '습관의 변화'입니다. 개발자는 편리함에 익숙해져 버전 명시 없이 패키지를 설치하거나, 공식 문서가 불분명한 패키지를 사용할 때가 많습니다. 하지만 이러한 관행은 추후 보안 리스크를 증폭시키는 원인이 됩니다.
pip install 명령어를 사용할 때는 항상 --no-cache-dir 옵션과 함께 버전 고정을 고려하고, Poetry 사용 시에는 poetry.lock을 팀원과 공유하는 것이 좋습니다.
아래는 pip와 Poetry에서 보안적으로 안전하게 패키지를 설치하는 파이썬 실전 예시입니다. 주요 부분에 주석이 포함되어 있어 이해를 도와줍니다.
# 안전한 pip 설치 예시
# --no-cache-dir: 캐시 사용 금지
# --require-hashes: 해시값 일치하는 패키지만 설치
pip install --no-cache-dir --require-hashes -r requirements.txt
# 예시 requirements.txt 내용
# 모든 패키지는 버전 고정 + SHA256 해시 포함
requests==2.31.0 \
--hash=sha256:f7e2e6f5f6c97f2b2a66d207f0dcd121c9e4a56f5b09d4ef0cc4b5e9d674d95c
# Poetry를 이용한 설치 및 lock 공유
poetry init # pyproject.toml 생성
poetry add requests@2.31.0 # 의존성 추가
poetry lock # lock 파일 생성
poetry install # lock 기반 설치
# Poetry로 설치된 의존성 확인
poetry show --tree
# 예시: 취약한 패키지 버전 자동 업데이트 차단
# lock 파일 덕분에 팀 전체 동일한 버전 사용 가능
5. 소프트웨어 공급망 공격과 대응 전략
최근 보안 업계에서는 ‘소프트웨어 공급망 공격(Software Supply Chain Attack)’이라는 개념이 자주 언급됩니다. 이는 코드, 라이브러리, 빌드 도구 등의 외부 구성요소에 악성 코드가 삽입되어 최종 사용자에게 영향을 주는 방식입니다.
| 공격 방식 | 대응 방안 |
|---|---|
| 패키지 이름 도용 (Typosquatting) | 패키지 설치 전 PyPI 공식 경로 및 문서 확인 |
| 의존성 전이 공격 | poetry.lock 또는 pip freeze로 의존성 고정 |
| 공격 코드 삽입 | pip-audit, Bandit 등 자동 점검 도구 활용 |
아래는 Bandit을 이용하여 공급망 관련 보안 취약점을 정적 분석하는 파이썬 예시입니다.
# Bandit 설치
pip install bandit
# 보안 스캔 실행
bandit -r . # 현재 프로젝트 전체 재귀 분석
# 예시 취약 코드 - 하드코딩된 비밀번호
import os
def connect_to_db():
password = "supersecret" # 🔴 위험: 하드코딩된 비밀번호
os.system(f"psql -U user -W {password}")
# 개선된 예시
def connect_to_db():
import getpass
password = getpass.getpass("Enter DB password: ") # ✅ 안전: 사용자 입력
os.system(f"psql -U user -W {password}")
# Bandit은 위와 같은 코드를 탐지하여 CVE 연동된 리포트를 생성
# 공급망 보안을 위해 정기적으로 실행 권장
6. 조직 내 패키지 보안 정책 수립 가이드
팀이나 조직 단위에서도 패키지 보안을 위한 내부 정책이 필요합니다. 단순한 도구 사용을 넘어서, 팀 전체가 공통된 보안 기준을 가지고 패키지를 관리해야만 지속적인 보안 수준을 유지할 수 있습니다.
- 공식 리포지토리(Python Package Index) 외 사용 금지
- CI 파이프라인에서 취약점 검사 자동화 설정
- 보안 업데이트 대상 패키지 주기적 검토
- 외부 패키지 승인 프로세스 문서화
- Poetry 또는 Pipfile.lock 파일 공유 표준화
![]() |
| 파이썬 의존성 보안 점검 – Poetry와 pip의 보안 관리 방법 요약 (남성 중심) |
7. 자주 묻는 질문 (FAQ)
비추천합니다. 환경 간 충돌과 의존성 중복 문제로 이어질 수 있으므로 한 가지 도구로 통일하는 것이 안전합니다.
항상 그렇지 않습니다. 일부 최신 패키지에는 테스트되지 않은 코드나 새로운 취약점이 포함될 수 있습니다. 버전 고정을 권장합니다.
pip-audit는 PyPI 중심의 취약점 데이터를 기반으로 CLI에서 빠르게 분석하며, safety는 DB 기반으로 좀 더 상세한 리포트를 제공합니다.
동일한 개발 환경을 보장하고, 갑작스러운 업데이트로 인한 예기치 못한 버그나 보안 취약점을 방지하기 위함입니다.
반드시 공유해야 합니다. 그래야 모든 팀원이 동일한 의존성 환경에서 개발할 수 있습니다.
8. 마무리 요약
✅ 라이브러리 의존성 보안은 개발자 책임입니다
개발 환경이 편리해진 만큼, 그 이면에는 보안에 대한 경각심이 필요합니다.
pip과 Poetry의 사용 방식 차이, 패키지 취약점 점검 도구 활용, 안전한 설치 습관, 공급망 공격 대응, 조직 내 정책 수립까지.
이 모든 요소가 모여야 실질적인 보안 체계가 완성됩니다.
특히 팀 개발 환경이라면 버전 고정과 lock 파일 공유는 더 이상 선택이 아닌 필수입니다.
지금 사용 중인 패키지를 다시 한번 점검해보세요. 그것이 보안의 시작입니다.


댓글
댓글 쓰기