MySQL 미드레벨 보안 면접
새 면접Q. MySQL을 사용하는 웹 애플리케이션에서 사용자 입력값을 쿼리에 포함시킬 때 SQL Injection 공격을 방지하기 위한 방법들을 설명하고, Prepared Statement와 Stored Procedure를 사용하는 것이 단순 문자열 이스케이핑보다 안전한 이유를 설명해주세요. 또한 ORM을 사용하더라도 SQL Injection에 취약할 수 있는 경우를 예시와 함께 설명해주세요.
파라미터 바인딩의 동작 원리와 쿼리 파싱 시점을 생각해보세요.
Prepared Statement는 쿼리 구조와 데이터를 분리하여 서버에서 먼저 쿼리를 컴파일한 후 파라미터를 바인딩하므로, 사용자 입력이 쿼리 구조를 변경할 수 없습니다. 문자열 이스케이핑은 특정 문자만 처리하므로 인코딩 우회나 복잡한 공격에 취약할 수 있습니다. Stored Procedure도 내부에서 동적 쿼리를 사용하지 않는 한 안전하며, 권한 분리도 가능합니다. ORM에서도 raw query나 동적으로 컬럼명/테이블명을 조합할 때는 SQL Injection에 취약할 수 있으므로, 화이트리스트 검증이 필요합니다. 또한 ORDER BY나 LIMIT 절에 사용자 입력을 직접 넣는 경우도 주의해야 합니다.
- • Prepared Statement는 쿼리 구조와 데이터를 분리하여 파싱 시점이 다름
- • 문자열 이스케이핑은 인코딩 우회 공격에 취약할 수 있음
- • ORM에서도 raw query, 동적 컬럼명/테이블명, ORDER BY 절 등은 취약점이 될 수 있음
사용자 검색 기능이나 필터링 기능에서 입력값을 쿼리에 안전하게 포함시킬 때 사용됩니다.
MySQL의 PREPARE, EXECUTE, DEALLOCATE 구문을 사용한 동적 쿼리 실행 시 SQL Injection을 방지하려면 어떻게 구현해야 하나요?
Q. MySQL 데이터베이스에 저장되는 개인정보를 보호하기 위해 애플리케이션 레벨 암호화, MySQL의 AES_ENCRYPT 함수, TDE(Transparent Data Encryption)를 사용하는 방법이 있습니다. 각 방식의 동작 원리와 장단점을 비교하고, 주민등록번호나 신용카드 번호 같은 민감정보를 저장할 때 어떤 방식이 적합한지 키 관리, 검색 가능성, 백업 보안, 성능 관점에서 설명해주세요.
암호화 시점과 키 관리 주체, 그리고 암호화된 데이터의 검색 가능 여부를 중심으로 생각해보세요.
애플리케이션 레벨 암호화는 데이터베이스 도달 전에 암호화하므로 DB 관리자로부터도 보호되며 키 관리를 완전히 제어할 수 있지만, 암호화된 값으로는 검색이 불가능하고 인덱스 활용이 어렵습니다. AES_ENCRYPT 함수는 쿼리 내에서 암호화하므로 구현이 간단하지만 키가 쿼리에 노출될 수 있고 성능 오버헤드가 큽니다. TDE는 데이터 파일 자체를 암호화하여 백업 파일 유출 시 보호되고 쿼리 성능에 영향이 적지만, DB 접속 권한이 있으면 복호화된 데이터를 볼 수 있어 내부자 위협에는 취약합니다. 민감정보는 애플리케이션 레벨 암호화로 보호하되, 검색이 필요한 경우 해시값을 별도 컬럼에 저장하거나 토큰화(Tokenization)를 고려하고, TDE는 추가 보안 계층으로 함께 적용하는 것이 적합합니다.
- • 애플리케이션 레벨 암호화는 DB 관리자로부터도 보호되지만 검색과 인덱싱이 어려움
- • TDE는 파일 레벨 암호화로 백업 보안에 유리하지만 DB 접속 권한자에게는 노출됨
- • 민감정보는 애플리케이션 암호화 + 검색용 해시 컬럼 + TDE 조합이 적합함
금융권이나 의료 시스템에서 개인정보 보호법 준수를 위해 민감정보를 암호화하여 저장할 때 사용됩니다.
암호화된 개인정보를 부분 검색(LIKE 검색)해야 하는 요구사항이 있다면 어떻게 설계하시겠습니까?
Q. MySQL에서 최소 권한 원칙(Principle of Least Privilege)을 적용하여 애플리케이션 사용자 계정을 설계해야 합니다. 일반 웹 애플리케이션, 읽기 전용 분석 도구, 배치 작업용 계정에 각각 부여해야 할 적절한 권한을 설명하고, GRANT 문에서 테이블 레벨, 컬럼 레벨 권한을 구분하는 것이 보안상 중요한 이유를 실무 예시와 함께 설명해주세요. 또한 프로덕션 환경에서 root 계정 사용을 피해야 하는 이유도 함께 설명해주세요.
각 계정의 역할에 따라 필요한 최소한의 권한만 부여하는 관점에서 생각해보세요.
일반 웹 애플리케이션 계정에는 특정 데이터베이스의 SELECT, INSERT, UPDATE, DELETE 권한만 부여하고 DROP, ALTER 같은 DDL 권한은 제외합니다. 읽기 전용 분석 도구에는 SELECT 권한만 부여하며, 민감정보 컬럼은 제외하거나 마스킹된 뷰를 제공합니다. 배치 작업 계정은 작업에 필요한 특정 테이블과 작업(예: 로그 삭제를 위한 DELETE)만 허용합니다. 컬럼 레벨 권한을 사용하면 같은 테이블 내에서도 민감정보 컬럼(주민번호, 급여 등)에 대한 접근을 제한할 수 있어 내부자 위협을 줄일 수 있습니다. root 계정은 모든 권한을 가지므로 SQL Injection이나 계정 탈취 시 전체 시스템이 위험해지며, 감사 로그에서 실제 작업 주체를 구분하기 어려워 책임 추적성이 떨어집니다.
- • 역할별로 필요한 최소 권한만 부여하여 공격 표면 최소화
- • 컬럼 레벨 권한으로 민감정보에 대한 세밀한 접근 제어 가능
- • root 계정 사용은 보안 위험과 책임 추적성 저하를 초래함
마이크로서비스 아키텍처에서 각 서비스별로 독립된 DB 계정을 생성하고 필요한 테이블에만 접근 권한을 부여할 때 사용됩니다.
MySQL 8.0에서 도입된 Role 기능을 사용하면 권한 관리를 어떻게 개선할 수 있나요?
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요!