DP-300 시험에서 컴플라이언스 파트는 '어떤 상황에서 어느 보안 기능을 선택하는가'를 묻습니다. 암호화는 데이터를 잠그지만, 규제 기관은 그것만으로는 충분하지 않다고 봅니다. 누가 언제 무엇을 조회했는지, 민감 컬럼이 화면에 노출되지 않도록 구조적으로 막았는지, 데이터가 변조되지 않았음을 증명할 수 있는지까지 요구합니다. Azure SQL Database는 이 각각의 요구를 다른 레이어에서 해결하는 도구를 제공합니다.
SQL Audit — CCTV처럼 모든 것을 기록한다
편의점에 카메라가 없다면 누가 물건을 가져갔는지 사후에 확인할 방법이 없습니다. SQL Audit은 데이터베이스에 CCTV를 다는 작업과 같습니다. 누가 어느 테이블을 언제 조회하거나 수정했는지 로그로 남겨두어, 나중에 감사 보고서로 꺼낼 수 있게 합니다.
서버 수준 정책은 해당 서버 아래 있는 모든 데이터베이스에 일괄 적용됩니다. 한 조직이 여러 데이터베이스를 운용하면서 감사 정책을 일관되게 유지하고 싶을 때 유리합니다. 데이터베이스 수준 정책은 특정 데이터베이스에만 적용되며, 서버 정책과 별도로 추가 구성할 수 있습니다.
감사 로그는 Storage Account, Log Analytics Workspace, Event Hub 세 곳으로 보낼 수 있습니다. Storage Account는 장기 보관에 적합하고, Log Analytics는 Kusto 쿼리로 즉시 분석할 수 있으며, Event Hub는 실시간 스트리밍이 필요한 파이프라인에 연결할 때 씁니다. 시험에서는 "규제 기관에 장기 보존 증거를 제출해야 한다"는 시나리오에 Storage Account, "실시간 이상 탐지와 연동"에 Event Hub가 답이 되는 경우가 많습니다.
Dynamic Data Masking — 영수증의 카드번호를 가려주기
카페에서 영수증을 받으면 카드번호 중간 자리가 별표로 가려져 있습니다. 실제 번호는 결제 시스템에 그대로 있고, 영수증에는 끝 네 자리만 노출됩니다. Dynamic Data Masking(DDM)이 하는 일이 바로 이것입니다. 실제 데이터는 DB에 그대로 저장되어 있고, 조회 시 권한 없는 사용자에게는 마스킹된 값이 반환됩니다.
마스킹 규칙은 다섯 가지 유형이 있습니다. 는 숫자를 0, 문자를 X, 날짜를 1900-01-01로 대체합니다. 은 첫 글자와 도메인 접미사만 남깁니다. 은 지정한 접두·접미사와 임의 길이 X를 조합합니다. 는 설정한 범위 내 임의 숫자로 대체합니다. 은 지정한 앞뒤 글자만 노출하고 나머지를 마스킹합니다.
DDM에서 가장 중요한 시험 포인트는 권한입니다. 이 권한이 있는 사용자는 원본 값을 그대로 볼 수 있습니다. db_owner 역할의 관리자도 마스킹이 적용되지 않습니다. DDM은 화면 표시 레이어를 제어할 뿐, 데이터베이스 엔진 수준의 접근 제어를 대체하지 않습니다.
Row-Level Security — 사무실마다 다른 출입증
대기업 본사 건물에서는 영업팀 직원이 연구개발팀 사무실에 들어갈 수 없습니다. 출입증이 있어도 허용된 층만 열립니다. Row-Level Security(RLS)는 같은 테이블을 조회해도 사용자 컨텍스트에 따라 보이는 행이 다르게 만드는 기능입니다.
RLS는 두 가지 요소로 작동합니다. 은 인라인 테이블 값 함수로, "이 행을 이 사용자가 볼 수 있는가"를 판단하는 논리를 담습니다. 는 해당 함수를 테이블에 바인딩합니다. Predicate 유형은 두 가지입니다. 는 SELECT 결과에서 조건을 충족하지 않는 행을 조용히 제거합니다. 는 INSERT, UPDATE, DELETE 같은 쓰기 작업까지 차단합니다.
RLS가 자주 쓰이는 대표 사례는 SaaS 멀티테넌트입니다. 하나의 테이블에 여러 고객사 데이터가 섞여 있을 때 RLS를 적용하면, 각 고객사는 자기 데이터만 볼 수 있습니다. 테이블이나 뷰를 고객사별로 따로 만들지 않아도 됩니다.
Ledger — 공증된 변조 불가 기록
공증 사무소에서 발행한 서류는 날인 이후 내용을 수정할 수 없습니다. 수정하면 위조임을 즉시 알아볼 수 있습니다. Azure SQL Ledger는 데이터베이스 레코드에 같은 개념을 적용합니다. 블록체인 방식의 암호학적 해시로 테이블 히스토리를 보호하기 때문에, 누군가 과거 레코드를 변경했다면 검증 시 즉시 탐지됩니다.
Ledger 테이블에는 두 종류가 있습니다. 은 행을 수정·삭제할 수 있지만 그 이력이 별도 히스토리 테이블에 암호학적으로 누적됩니다. 은 INSERT만 가능하고 UPDATE·DELETE가 차단됩니다. 시험에서 "데이터 변조 감지", "변경 불가 증명"이 나오면 Ledger가 답입니다.
Defender for SQL — 데이터베이스 앞의 경비원
공장 정문에 경비원이 있으면, 평소와 다른 차량이나 출입 패턴을 보고 즉시 보고합니다. Microsoft Defender for SQL은 쿼리 패턴과 접근 동작을 분석해 비정상 행위를 자동으로 감지합니다.
Defender for SQL은 두 가지 기능으로 구성됩니다. 는 설정 오류, 과도한 권한, 미적용 패치 등 알려진 취약점을 스캔하고 개선 권고를 제공합니다. 은 런타임에 SQL injection 시도, 비정상적인 로그인 위치, 브루트 포스 공격 같은 이상 패턴을 실시간으로 탐지합니다. Audit 로그가 "무엇이 발생했는지 기록"이라면, Defender는 "비정상 패턴 발생 시 경보를 보내는 것"입니다.
보안 기능 한눈에 비교
보안 기능이 여러 개라서 어떤 상황에 무엇을 쓰는지 혼동하기 쉽습니다. 주방에 칼이 여러 개 있어도 용도가 다른 것처럼, 각 기능은 다른 레이어를 보호합니다. Always Encrypted는 DDM·RLS와 자주 비교됩니다. DDM은 표시만 가리고 DB에는 평문이 저장되지만, Always Encrypted는 DB 서버도 평문을 볼 수 없고 암호화 키는 클라이언트가 보유합니다.
각 기능의 역할을 정리하면 다음과 같습니다. SQL Audit은 접근 기록만 남기며 우회 개념이 없습니다(감사 증적·컴플라이언스 보고). Dynamic Data Masking은 표시 값을 숨기지만 UNMASK 권한이 있으면 우회됩니다(앱 사용자에게 민감 컬럼 숨김). Row-Level Security는 행 접근을 제한하지만 db_owner는 우회합니다(멀티테넌트, 부서별 격리). Always Encrypted는 클라이언트 키 없이는 우회가 불가능합니다(암호화된 채로 저장·전송). Ledger는 변조 시 즉시 탐지됩니다(변조 불가 증명).
!데이터 보호 기능 4가지 비교
실무 함정 — 권한 우회와 조합 설계
보안 기능을 하나만 믿으면 빈틈이 생깁니다. DDM은 일반 앱 사용자에게는 효과적이지만, DBA가 직접 Management Studio로 접속하면 마스킹이 적용되지 않습니다. RLS도 db_owner는 우회합니다. 시험에서 "DBA도 접근할 수 없어야 한다"는 요구가 나오면 Always Encrypted가 답입니다.
Ledger는 "변조 감지"에 특화되어 있고 접근 제어 기능이 없습니다. 누가 레코드를 삽입했는지 로그로 남기려면 SQL Audit을 함께 써야 합니다. Defender for SQL은 위협 탐지이지, 데이터 마스킹이나 접근 차단 역할을 하지 않습니다. Data Discovery & Classification은 민감 컬럼을 자동 발견해 라벨을 붙여주는 도구로, 이 라벨이 DDM이나 Audit 정책의 기반 정보가 됩니다.
시험 핵심 정리
"누가 언제 어떤 쿼리를 실행했는지 기록" -- SQL Audit "감사 로그를 장기 보존" -- Storage Account destination "실시간 파이프라인으로 감사 로그 전송" -- Event Hub destination "앱 사용자에게 카드번호 일부만 보이게" -- Dynamic Data Masking "DBA도 평문을 볼 수 없어야 한다" -- Always Encrypted "같은 테이블인데 부서별로 다른 행만 보여야 한다" -- Row-Level Security (FILTER predicate) "데이터 삽입은 되지만 수정·삭제는 차단" -- Append-only ledger table "과거 레코드 변조 여부를 수학적으로 증명" -- Azure SQL Ledger "SQL injection 시도 실시간 감지" -- Defender for SQL (Advanced Threat Protection) "설정 오류·과도한 권한 스캔" -- SQL Vulnerability Assessment "민감 컬럼 자동 분류·라벨" -- Data Discovery & Classification "멀티테넌트 고객사 데이터 격리" -- Row-Level Security
SQL Audit = 기록, DDM = 표시 마스킹, RLS = 행 격리, Ledger = 변조 증명, Defender = 위협 탐지