SQL DCL

src/content/documents/data-analysis/sql-dcl-roles-and-privileges.json

DCL(Data Control Language)은 데이터베이스 객체에 누가 어떤 작업을 할 수 있는지 제어하는 SQL이다. PostgreSQL에서는 역할(role)에 권한을 부여하거나 회수하는 GRANT와 REVOKE가 핵심이다.

왜 권한을 나눠야 할까

게임 서버, 고객 지원 도구, 데이터 분석가는 같은 DB를 사용해도 필요한 작업이 다르다. 분석가가 실수로 캐릭터를 삭제하거나 읽기 전용 대시보드의 키가 유출되어 아이템 수량을 바꾸는 일을 막으려면 필요한 권한만 나눠 줘야 한다. 이것이 최소 권한 원칙이다.

GRANT와 REVOKE

명령

의미

GRANT

역할에 객체 접근 또는 역할 소속 권한을 부여

분석가에게 SELECT 허용

REVOKE

이미 부여한 권한을 회수

운영 도구에서 DELETE 제거

게임 DB 역할 분리 예시

-- 로그인 계정이 상속받을 권한 묶음
CREATE ROLE game_runtime NOLOGIN;
CREATE ROLE game_analyst NOLOGIN;

-- 게임 서버: 필요한 테이블의 조회·추가·변경만
GRANT SELECT, INSERT, UPDATE
ON character, inventory
TO game_runtime;

-- 분석가: 조회만
GRANT SELECT
ON character, inventory, item
TO game_analyst;

-- 더 이상 필요하지 않은 삭제 권한 회수
REVOKE DELETE
ON character, inventory
FROM game_runtime;

NOLOGIN 역할은 권한 묶음으로 사용하고 실제 로그인 역할이 이를 상속받게 만들 수 있다. 테이블 권한만으로 끝나지 않을 수 있다. 스키마 USAGE, 시퀀스 권한, 함수 EXECUTE처럼 실제 쿼리가 사용하는 객체도 함께 점검해야 한다.

권한 설계 체크리스트

  • 사람이나 서비스 계정에 직접 흩뿌리지 않고 업무 역할에 권한을 묶는다.

  • ALL PRIVILEGES부터 주지 말고 필요한 객체와 SELECT·INSERT·UPDATE 같은 작업을 열거한다.

  • 운영 환경과 개발 환경의 역할을 분리하고 퇴사·담당 변경 시 소속 역할을 즉시 회수한다.

  • 권한 변경 후 실제 역할로 접속해 허용 작업은 성공하고 금지 작업은 실패하는지 검사한다.

참고 자료

댓글 0

댓글을 불러오는 중…