파일 업로드 보안 취약점 완전 방어: MIME 위조·웹쉘 차단 실전 가이드
확장자 화이트리스트와 Content-Type 검증을 다 걸어뒀는데도 웹쉘이 떨어졌다. 파일 업로드 보안 취약점이 어디서 새는지, magic bytes도 polyglot으로 우회되는 이유를 따라가본다. 결국 재인코딩과 웹루트 외부 저장이 가장 효과적이라는 결론에 도달했다.
확장자 화이트리스트와 Content-Type 검증을 다 걸어뒀는데도 웹쉘이 떨어졌다. 파일 업로드 보안 취약점이 어디서 새는지, magic bytes도 polyglot으로 우회되는 이유를 따라가본다. 결국 재인코딩과 웹루트 외부 저장이 가장 효과적이라는 결론에 도달했다.
requests에서 httpx로 갈아타며 알게 된 동작 차이를 정리한다. 단순 API 호환을 넘어서 timeout과 connection pool 동작이 다르더라.
FastAPI 앱을 systemd 서비스로 올리다가 status=203/EXEC를 두 시간 본 기록이다. unit 파일 절대 경로, Restart 옵션, journalctl 필터, 부팅 시 자동 실행 설정까지 Ubuntu 22.04 기준으로 한 번에 정리했다.
pathlib은 Python 3.4부터 표준에 들어온 객체지향 경로 모듈이다. os.path를 어디까지 대체할 수 있는지, 실무에서 어떻게 써야 하는지 근거와 함께 정리한다.
프론트에서만 보던 CORS 오류를 백엔드에서 직접 다뤄보니 완전히 다른 풍경이 보였다. 세 가지 환경에서 안전하게 푸는 기준을 정리한다.
Temporal 붙이기 전에 Postgres로 어디까지 되는지 궁금해서 직접 짜봤다. SKIP LOCKED 한 줄이 절반 이상을 해결해줬고, 나머지는 트랜잭션 경계를 잘 긋는 문제였다.
FastAPI에 SQLAlchemy 2.0 async를 붙이면 처음엔 잘 돈다. 트래픽이 늘면 greenlet과 풀 에러가 동시에 터진다. 두 에러의 뿌리를 짚고 안정적인 세션 라이프사이클 패턴을 정리한다.
v1 코드를 v2로 옮길 때 가장 자주 막히는 10개 지점을 비교표로 정리한다. 한 번에 갈아엎을지, bridge로 분산할지 판단 기준과 실측 수치를 같이 본다.
reuse_detected 알람이 87건 한꺼번에 떴다. 사용자는 강제 로그아웃됐고 CS는 불탔다. Refresh Token Rotation 구현은 단순한 토큰 교체가 아니라 race condition과 false positive와의 줄타기였다.
TTL을 고정값으로 두면 만료가 한 시점에 몰린다. Redis 캐시에 Jitter를 더해 부하를 분산하는 패턴과 실제 측정값을 정리했다.
Docker 컨테이너 DNS 설정 때문에 두 번 막혔다. default bridge에서 서비스 이름이 안 풀린 게 첫 번째, alpine 이미지에서 응답이 5초씩 느려진 게 두 번째였다.
단순 INCR로 안심하다가 burst 트래픽에 뚫린 경험에서 출발한다. Token Bucket과 Sliding Window의 동작 차이, Lua 원자성, DDoS 다층 방어까지 운영 관점으로 정리한다.