프로그래밍/C, C++, Java, Python

Python tarfile 추출 필터 기준 정리

포도알77 2026. 6. 25. 10:12

본문 중간의 쿠팡 추천 상품 구매시 쿠팡 파트너스에서 일정액의 수수료를 제공받습니다.

Python tarfile 추출 필터 기준 정리

Python의 tarfile은 tar 아카이브를 다룰 때 많이 쓰지만, 추출 기본값을 오래된 예제로만 기억하면 보안 판단이 어긋날 수 있다. 2026년 6월 25일 기준 Python 3.14.6 공식 문서를 보면 TarFile.extractall()extract()는 3.12에서 추출 필터를 도입했고, 3.14부터 기본 필터가 fully_trusted 상당 동작에서 data로 바뀌었다.

핵심은 단순하다. 신뢰하지 않는 tar 파일을 풀 때는 기본값에 기대지 말고 filter='data'를 명시하는 편이 안전하다. 이 글은 fully_trusted, tar, data의 차이와 어떤 상황에서 무엇을 고를지 기준만 정리한다.

먼저 무엇이 달라졌을까?

PEP 706은 tarfile.extractall()에 필터 개념을 추가해, 멤버를 추출 직전에 수정하거나 거부할 수 있게 하는 방향을 정의했다. 현재 공식 문서 기준으로는 3.12에서 filter 인자가 추가됐고, 3.14부터 filter를 생략했을 때 기본값이 data가 된다.

버전대 필터 기능 기본 동작에서 볼 점
3.11 이하 추출 필터 없음 안전한 기본 필터를 기대하기 어렵기 때문에 호출 코드에서 별도 방어가 필요함
3.12~3.13 filter 인자 추가 현재 문서는 하위 버전 호환을 위해 filter='data'를 명시하라고 권장함
3.14+ filter 인자 유지 생략 시 기본값이 data

중요한 점은 3.14에서도 "아무 tar나 마음 놓고 풀어도 된다"는 뜻은 아니라는 것이다. 공식 문서는 여전히 신뢰하지 않는 아카이브를 사전 확인 없이 추출하지 말라고 경고하고, 예외가 나면 일부 파일만 부분 추출된 상태로 남을 수 있다고 설명한다.

세 가지 필터는 어떻게 다를까?

필터 의미 무난한 사용 상황
fully_trusted 아카이브의 메타데이터를 그대로 신뢰 직접 만든 tar를 내부 파이프라인에서 다시 푸는 경우처럼 완전히 신뢰할 수 있을 때
tar GNU tar 일반 사용자 기본 동작에 가깝게 일부 위험 요소를 제한 UNIX 파일 속성을 어느 정도 유지해야 하지만 절대 경로나 대상 경로 탈출은 막고 싶을 때
data 링크, 디바이스 파일, 일부 권한/소유자 정보를 더 강하게 제한 일반적인 데이터 번들, 업로드 파일, 외부에서 받은 패키지처럼 교차 플랫폼 데이터 추출에 가까울 때

datatar가 막는 항목에 더해 절대 경로나 대상 경로 바깥을 가리키는 링크를 거부하고, 파이프와 디바이스 파일도 거부한다. 또한 일반 파일 권한을 더 보수적으로 다루고, 사용자와 그룹 정보도 무시한다. 반대로 tar 고유의 메타데이터를 최대한 보존해야 한다면 data가 지나치게 제한적일 수 있다.

filter='data'를 우선으로 생각해도 되는 경우

대부분의 애플리케이션에서는 tar를 백업 복원 포맷이 아니라 "파일 묶음 전달 포맷"으로 쓴다. 예를 들어 업로드된 데이터 세트, 배치 작업 입력물, 테스트 fixture, 외부 공급자가 준 산출물은 소유자 정보나 디바이스 파일을 복원하는 것보다 안전한 경로 안에 일반 파일을 푸는 것이 더 중요하다.

이런 경우라면 공식 문서가 설명하는 data 필터가 가장 무난하다. 특히 3.13 이하도 같이 지원하는 코드라면 버전에 따라 기본값이 달라질 수 있으므로, 호출부에서 filter='data'를 명시하는 편이 일관성이 있다.

 

 

tar 필터가 더 맞는 경우는 언제일까?

tar는 절대 경로와 대상 경로 이탈을 막고 위험한 모드 비트를 정리하지만, data처럼 UNIX 기능을 크게 줄이지는 않는다. 그래서 아카이브 안의 디렉터리 구조와 일부 메타데이터를 유지해야 하고, 동시에 기본적인 경로 탈출 방어는 필요할 때 고려할 만하다.

다만 tar도 "신뢰하지 않는 아카이브를 아무 검토 없이 안전하게 푸는 만능 스위치"는 아니다. 링크 처리나 권한 복원 정책을 세밀하게 통제해야 하면 내장 필터만으로 끝내지 말고, 커스텀 필터나 추출 전 검증을 추가하는 편이 맞다.

fully_trusted는 언제만 써야 할까?

이 필터는 현재 동작을 최대한 보존하려는 목적에 가깝다. 아카이브에 담긴 경로, 링크, 권한, 소유자 정보를 그대로 존중하므로, 외부 입력을 다루는 일반 웹 서비스나 자동화 작업의 기본값으로 두기에는 부담이 크다.

무난한 사용 조건은 둘 중 하나다. 첫째, tar를 생성한 주체와 추출하는 주체가 같은 신뢰 경계 안에 있고 아카이브 내용을 이미 알고 있을 때. 둘째, 자체 검증 로직을 별도로 구현해 내장 필터보다 더 엄격하게 통제할 때다. 그 외에는 굳이 fully_trusted를 선택할 이유가 크지 않다.

실무에서는 어떻게 호출하는 편이 안전할까?

Python 3.13 이하를 함께 지원하거나, 실행 환경의 Python 마이너 버전이 자주 섞이는 서비스라면 다음처럼 필터를 명시하는 편이 안전하다.

import tarfile

with tarfile.open("bundle.tar.gz", "r:*") as tar:
    tar.extractall("/safe/destination", filter="data")

필터 기능이 있는지 런타임에서 확인해야 한다면 공식 문서는 Python 버전 숫자 비교보다 hasattr(tarfile, 'data_filter') 같은 기능 존재 여부를 보라고 안내한다. 배포판이 보안 백포트를 적용했을 수 있기 때문이다.

import tarfile

with tarfile.open("bundle.tar", "r:*") as tar:
    if hasattr(tarfile, "data_filter"):
        tar.extractall("/safe/destination", filter="data")
    else:
        raise RuntimeError("tarfile extraction filter를 지원하는 Python이 필요합니다.")

추출 시 같이 기억할 점

항목 기억할 점
extract() vs extractall() 공식 문서는 여러 추출 이슈 때문에 대부분 extractall() 사용을 고려하라고 설명함
예외 처리 필터 예외나 I/O 예외가 나면 일부 파일만 추출된 상태가 남을 수 있어 정리 로직이 필요함
라이브 파일시스템 문서는 추출 도중 대상 디렉터리가 동시에 바뀌는 상황까지 완전히 막아주지 않는다고 설명함
하위 버전 지원 3.13 이하 호환이 필요하면 기본값에 기대지 말고 필터를 명시하는 편이 안전함

자주 헷갈리는 질문

Q. Python 3.14 이상이면 filter를 생략해도 될까?

3.14 이상에서는 기본값이 data라서 이전보다 안전한 쪽으로 바뀌었다. 다만 코드 의도를 분명히 하고 하위 버전 동작 차이를 줄이려면 여전히 filter='data'를 적어 두는 편이 운영상 더 명확하다.

Q. 링크나 소유자 정보가 필요한 tar도 data를 써야 할까?

항상 그렇지는 않다. 링크나 소유자, 권한 복원이 중요한 백업성 아카이브라면 data가 필요한 기능을 막을 수 있다. 이 경우 tar 또는 커스텀 필터가 더 맞을 수 있다.

Q. fully_trusted는 금지해야 할 값일까?

금지라기보다 신뢰 경계가 매우 좁을 때만 써야 하는 값에 가깝다. 직접 생성한 tar를 같은 시스템 경계 안에서 다시 푸는 작업처럼, 아카이브 메타데이터를 그대로 복원하는 것이 목적일 때만 선택하는 편이 무난하다.

정리

현재 Python 공식 문서 기준으로 tarfile 추출에서 가장 무난한 기본 선택은 filter='data'다. 특히 외부 입력, 업로드 파일, 일반 데이터 번들을 다루는 서비스라면 이 선택이 가장 설명하기 쉽고 안전하다.

반대로 tar 포맷의 UNIX 특성을 보존해야 하면 tar나 커스텀 필터가 필요할 수 있고, fully_trusted는 완전히 신뢰된 아카이브에만 제한적으로 쓰는 편이 맞다. 버전이 섞인 환경에서는 "3.14부터 기본값이 바뀌었다"는 사실만 믿지 말고 호출 코드에서 필터를 명시하는 습관이 더 안전하다.

참고 자료

반응형

'프로그래밍 > C, C++, Java, Python' 카테고리의 다른 글

Python ExitStack 사용법  (0) 2026.07.06
Python asyncio timeout 기준 정리  (0) 2026.07.01
Python tempfile 사용법  (1) 2026.06.19
Python Path.relative_to 사용법  (1) 2026.06.13
Python Path.copy 사용법  (0) 2026.06.07
페이스북으로 공유카카오톡으로 공유카카오스토리로 공유트위터로 공유URL 복사