python
Python은 배우기 쉽고 사용이 편리한 프로그래밍 언어로, 특히 인공지능, 데이터 분석, 웹 개발 등 다양한 분야에서 널리 사용됩니다. 그러나 Python은 소스 코드가 일반 텍스트로 그대로 배포되기 때문에 배포된 프로그램의 코드가 외부에 쉽게 노출될 수 있다는 단점이 있습니다. 비즈니스 로직, 알고리즘 또는 API 키 같은 민감한 정보를 보호하지 않으면 보안상 치명적인 문제가 발생할 수 있습니다.
이러한 문제를 최소화하기 위한 가장 효과적인 방법 중 하나가 바로 난독화(Obfuscation)입니다. 난독화는 코드의 가독성을 고의로 어렵게 만들어, 외부에서 코드를 쉽게 분석하거나 복제하지 못하도록 보호하는 기술입니다. 이번 글에서는 Python의 대표적인 난독화 도구인 PyArmor의 상세한 사용법과 주요 옵션별 활용 방법을 예제를 통해 알아보도록 합시다.
PyArmor는 Python 코드를 암호화하고 난독화하여 배포된 소스 코드를 효과적으로 보호하는 도구입니다. Python 소스 파일(.py)을 암호화하여 .pyc 형태로 변환하고, 소스를 읽기 어렵게 만들 뿐 아니라 코드가 실행되는 환경을 제한하거나 라이선스 키 기반으로 배포하는 기능까지 제공합니다. PyArmor의 핵심 기능은 다음과 같습니다.
PyArmor는 Python 패키지 관리자인 pip
을 사용하여 설치할 수 있습니다.
pip install pyarmor
설치가 끝나면 다음 명령어로 설치 확인이 가능합니다.
pyarmor --version
PyArmor는 명령어 기반으로 동작합니다. 기본적으로 다음과 같은 형태로 코드를 난독화합니다.
pyarmor gen --output dist src
gen
: 프로젝트 난독화 및 배포용 파일 생성 명령어 (Python 3.7 / PyArmor 8.0 이후 버전 사용 가능)--output
: 난독화된 코드가 생성될 디렉토리 지정src
: 난독화할 소스 파일이 위치한 디렉토리실행 후, dist
폴더에는 암호화된 .pyc
파일과 pytransform
바이너리가 생성됩니다.
PyArmor 명령어의 주요 옵션에 대해 하나씩 자세히 알아보겠습니다.
--recursive (-r)
디렉토리 내의 모든 하위 폴더를 재귀적으로 난독화할 때 사용합니다.
pyarmor gen --recursive --output dist src
위 명령어는 src
디렉토리뿐 아니라 내부의 모든 하위 디렉토리까지 포함하여 난독화합니다.
--platform
난독화된 코드가 실행 가능한 특정 플랫폼을 제한할 때 사용합니다. 플랫폼별로 호환되는 바이너리를 지정할 수 있습니다.
pyarmor gen --platform linux.x86_64 --output dist src
위 코드는 리눅스 x86_64 환경에서만 실행 가능한 형태로 난독화를 진행합니다.
--advanced
더욱 강력한 난독화를 적용하는 옵션입니다. 코드 분석을 매우 어렵게 만들지만 실행 성능이 약간 떨어질 수 있습니다.
pyarmor gen --advanced 2 --output dist src
레벨은 보통 1~2로 지정할 수 있으며, 숫자가 클수록 더 강력한 난독화를 수행합니다.
licenses
)라이선스 기반으로 실행을 제한할 수 있습니다. 다음 명령어는 특정 날짜까지 유효한 라이선스를 생성합니다.
pyarmor licenses --expired "2026-01-01" CUSTOMER
위 명령어는 "2026년 1월 1일"까지 유효한 라이선스를 생성합니다. 해당 라이선스가 없는 환경에서는 코드가 실행되지 않습니다.
난독화 과정에서 특정 파일이나 디렉토리를 제외하고 싶을 때 사용하는 옵션입니다. 여러 번 사용하여 다양한 경로를 제외할 수 있습니다.
pyarmor gen --recursive --output ./_dist/ --exclude "./.venv/*" --exclude "./_dist/*" ./
위 예시에서는 .venv 디렉토리와 이미 생성된 _dist 디렉토리 내의 모든 파일을 난독화에서 제외하고 있습니다. 특히 가상 환경 디렉토리(.venv)나 이미 생성된 난독화 결과 디렉토리(_dist)를 다시 난독화하지 않도록 방지하는 용도로 활용됩니다.
난독화한 코드를 테스트하려면 생성된 dist
폴더에서 아래 명령어로 실행해보면 됩니다.
cd dist
python main.py
난독화된 상태에서 정상 실행된다면 배포 준비가 된 것입니다.
PyArmor는 매우 유용하지만 몇 가지 주의할 점이 있습니다.
첫째, 난독화로 완벽한 보안이 보장되지는 않습니다. PyArmor는 소스코드 분석을 어렵게 만들지만, 매우 전문적인 공격에는 리버스 엔지니어링될 가능성이 여전히 있습니다. 둘째, 코드를 난독화하면 일부 모듈(ctypes
, multiprocessing
, subprocess
등)과 충돌이 생길 수 있습니다. 프로젝트 난독화 후 반드시 충분한 테스트를 거쳐야 합니다. 셋째, PyArmor는 라이선스가 있으며 상업적 이용 시 유료 라이선스를 필요로 할 수 있습니다. 대규모 프로젝트의 경우 라이선스 비용을 미리 확인해야 합니다.
PyArmor는 다음과 같은 경우 특히 유용합니다.
PyArmor는 Python 개발자가 코드 보호와 배포 보안을 고민할 때 간단하고 효과적으로 사용할 수 있는 훌륭한 도구입니다. 설치 및 사용이 간단하고, 다양한 옵션으로 프로젝트의 성격에 맞는 난독화를 수행할 수 있어 실무에서도 많이 활용됩니다. 물론 완벽한 보호는 없으므로, PyArmor는 코드 보호 전략의 한 축으로 사용하면서 환경변수 관리, 보안 키 관리와 같은 다른 보안 전략과 병행하는 것이 좋습니다.