피드로 돌아가기
Dev.toDatabase
원문 읽기
SQL 파싱 제거 및 DB Transaction Level 제어로 Read-Only 무결성 확보
Don't parse SQL to make a query runner read-only
AI 요약
Context
사용자 입력 SQL의 쓰기 작업을 차단하기 위해 Application Layer에서 정규식이나 키워드 기반의 파싱을 시도하는 기존 방식의 한계 분석. CTE, 주석, side-effect function 등 다양한 우회 경로로 인해 정적 분석만으로는 완벽한 Read-Only 상태를 보장할 수 없는 보안 허점 식별.
Technical Solution
- SQL 문자열 분석을 완전히 배제하고 Postgres 엔진의
SET TRANSACTION READ ONLY명령을 통한 실행 권한 제어 - 트랜잭션 시작 직후 첫 번째 문장으로 Read-Only 설정을 배치하여 데이터 변경 시도 시 DB 엔진 수준에서 즉각적인 에러 반환 유도
statement_timeout설정을 통해 Cartesian Join 등 리소스 남용으로 인한 Backend 프로세스 점유 문제 방지fetchmany를 통한 최대 행 수 제한으로 메모리 과부하 방지 및 네트워크 대역폭 최적화- 트랜잭션 종료 시
rollback()을 강제 호출하여 스냅샷 및 락(Lock)을 즉시 해제하고 리소스 누수 차단
실천 포인트
1. SQL 키워드 필터링 대신 DB 내장 Transaction 모드 활용 검토
2. `SET TRANSACTION READ ONLY` 적용 시 반드시 트랜잭션의 첫 번째 문장으로 배치
3. Read-Only 모드와 별개로 `statement_timeout` 및 Row Limit 설정을 통한 리소스 보호 체계 구축
4. Auto-commit 설정 여부가 Read-Only 트랜잭션 동작에 미치는 영향 확인