보안 _ 노트북 실행 취약점 주의
PART 09 Ch01에서 marimo run이 기본적으로 인증을 제공하지 않는다는 점을 확인했습니다. 이 챕터는 그 사실을 바탕으로 실무에서 마주치는 보안 고려사항을 체크리스트 형태로 정리합니다. marimo만의 특별한 취약점을 다루는 것이 아니라, Python 애플리케이션을 서버에 올릴 때 일반적으로 적용되는 원칙입니다.
앱 모드와 코드 실행
marimo run notebook.py로 앱을 실행하면 서버가 뜨고 사용자가 브라우저에서 위젯을 조작할 수 있습니다. 위젯 조작은 Python 코드를 서버에서 실행하는 행위입니다. 사용자가 직접 코드를 입력하는 것은 아니지만, 서버 안에서 Python이 실행된다는 사실은 같습니다.
이 구조에서 보안 위험이 생기는 지점은 두 가지입니다.
접근 제어 없음. 서버 포트가 인터넷에 열려 있고 인증이 없으면, URL을 아는 사람은 누구든 앱을 사용할 수 있습니다. 앱이 파일을 읽거나 데이터베이스에 접근한다면, 그 기능도 노출됩니다.
신뢰할 수 없는 노트북 실행. .py 형식의 marimo 노트북은 일반 Python 파일입니다. 출처를 모르는 파일을 marimo run 또는 marimo edit으로 열면, 그 파일 안의 코드가 실행됩니다. Python이 할 수 있는 모든 것, 즉 파일 삭제, 네트워크 요청, 환경 변수 읽기가 가능합니다. 이것은 marimo에 국한되지 않고 Python 파일 실행 전반에 해당하는 원칙입니다.
체크리스트: 공개 배포 전
아래 항목을 배포 전에 확인합니다.
1. 인증 레이어를 앞에 두었는가.
marimo run은 인증을 제공하지 않습니다. 인터넷에 공개할 경우 리버스 프록시에 기본 인증(HTTP Basic Auth)을 설정하거나 클라우드 플랫폼의 접근 제어를 씁니다. 예를 들어 nginx에서 기본 인증을 추가하는 설정입니다.
server {
listen 80;
server_name example.com;
location / {
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
marimo 서버는 127.0.0.1:8080에서 내부 전용으로 실행하고, nginx가 인증을 담당하는 구조입니다.
2. 내부 네트워크 한정으로 충분한가.
팀 내부 VPN이나 사내 LAN에서만 접근하는 앱이라면, 별도 인증 없이 네트워크 수준에서 격리하는 방식도 현실적인 선택입니다. 중요한 것은 포트가 인터넷에 직접 열리지 않는 것입니다.
3. 민감한 정보가 코드에 하드코딩되어 있지 않은가.
데이터베이스 암호, API 키, 접속 문자열 같은 값을 코드에 직접 쓰지 않습니다. 환경 변수로 관리합니다.
import os# 코드에 직접 쓰면 안 됩니다.# db_password = "my_secret_password"# 환경 변수에서 읽습니다.db_password = os.environ.get("DB_PASSWORD")if db_password is None: raise EnvironmentError("DB_PASSWORD 환경 변수가 설정되지 않았습니다.")
.env 파일을 쓴다면 .gitignore에 반드시 추가합니다.
# .gitignore.env*.env
# python-dotenv를 사용하는 경우from dotenv import load_dotenvimport osload_dotenv() # .env 파일에서 환경 변수를 로드합니다.api_key = os.environ.get("API_KEY")
4. 공유 자원 접근이 있는가.
PART 09 Ch01에서 언급했듯, 여러 사용자가 접근하는 앱에서 파일 시스템에 쓰는 코드가 있다면 동시 접근을 고려해야 합니다. 특정 경로에 파일을 저장하거나 같은 데이터베이스 레코드를 수정하는 기능이 있다면, 동시 접근 시 어떻게 동작하는지 검토합니다.
5. 출처를 모르는 노트북을 열지 않는다.
외부에서 받은 .py marimo 파일을 열기 전에 코드를 텍스트 에디터로 먼저 확인합니다. Python 파일이므로 subprocess, os.system, 네트워크 요청을 포함할 수 있습니다. 신뢰할 수 있는 출처의 파일만 실행하는 것이 원칙입니다.
HTTPS 설정
HTTP로 민감한 데이터가 오가는 앱을 배포하면 네트워크 경로에서 내용이 노출될 수 있습니다. Let's Encrypt 등으로 TLS 인증서를 발급받아 HTTPS로 서비스하는 것을 권장합니다. 리버스 프록시 설정에 TLS를 추가하는 방식이 일반적입니다. marimo 서버 자체는 HTTP로 두고, 앞의 nginx나 Caddy에서 TLS를 처리합니다.
무엇을 과도하게 걱정하지 않아도 되는가
내부망에서만 쓰는 분석 노트북, 팀원 몇 명만 접근하는 대시보드, WASM으로 내보낸 브라우저 단독 실행 앱(서버 없음)이라면 위 체크리스트 중 상당 부분이 해당하지 않습니다. WASM 배포는 서버 자체가 없으므로 인증이나 공유 자원 문제가 없습니다.
중요한 것은 "누가 접근하는가", "무엇을 할 수 있는가"를 배포 전에 한 번 생각하는 습관입니다.
정리
marimo run은 인증을 내장하지 않습니다. 인터넷에 공개할 때는 리버스 프록시에 인증을 추가합니다.- 민감한 값은 코드에 쓰지 않고 환경 변수로 관리합니다.
.env파일은.gitignore에 추가합니다. - 출처를 모르는 marimo
.py파일은 열기 전 코드를 텍스트로 확인합니다. Python 파일이므로 열면 실행됩니다. - 여러 사용자가 쓰는 앱에 파일 쓰기나 DB 수정 기능이 있다면 동시 접근 시나리오를 검토합니다.
- 내부망 한정이거나 WASM 배포라면 위 항목 대부분이 해당되지 않습니다. 상황에 맞게 판단합니다.