메인 칼럼 개발일지 작업물 연락처
← adelie 프로젝트
adelie

Windows 호환성 — 이 고생을 왜 했나

Windows보안크로스플랫폼

macOS에서 잘 돌아가던 게 Windows에서 온갖 곳에서 터졌다. 이틀 동안 Windows 호환성만 잡았다.

WinError 87

os.kill(pid, 0)가 Windows에서 안 된다. 리눅스/맥에서는 프로세스 존재 여부 체크하는 관용적인 방법인데, Windows는 이 시그널 자체를 지원 안 함. Monitor AI랑 Runner AI에서 프로세스 상태 확인할 때 쓰고 있었는데, 전부 ctypes.windll.kernel32.OpenProcess로 바꿔야 했다.

보안 구멍들

크로스플랫폼 작업하면서 보안 점검도 같이 했는데, 생각보다 구멍이 많았다.

BLOCKED_CHARS에서 &&만 막고 있었는데, Windows cmd.exe& 하나로도 명령어 체이닝이 된다. > 리다이렉션도 마찬가지. 전부 단일 문자로 막도록 바꿨다.

경로 순회 방지도 문제였다. 기존엔 /로 시작하는지만 체크했는데, Windows의 C:\... 같은 절대경로는 통과해버리는 거였다. Path.resolve()로 실제 해석된 경로가 staging 루트 안에 있는지 확인하는 방식으로 바꿨다.

python3 스텁

이건 좀 웃긴 건데, Windows에서 shutil.which("python3") 하면 Microsoft Store의 가짜 stub이 잡힌다. WindowsApps/python3.EXE라는 놈인데, 실행하면 Store 페이지만 열림. sys.executable로 현재 실행 중인 Python을 직접 쓰도록 바꿨다.

venv 활성화

source bin/activate가 당연히 Windows에서 안 된다. activate.bat &&로 바꿔야 하고, 서브프로세스도 cmd /c로 감싸야 했다. env_strategy.py 전체를 OS별 분기 처리했는데, 코드가 좀 지저분해진 건 아쉽다.

그래도 이 작업 끝나고 나서 크로스플랫폼 테스트 6개가 전부 통과했을 때는 좀 시원했다.

김현빈 Developer & Writer

기술, 포스팅 관련 질문, 프로젝트 협업 등 연락주시면 언제든지 회신 드립니다.