데이터베이스 개념노트 14편 - DCL, GRANT, REVOKE
지난 글에서는 테이블 구조를 생성, 변경, 삭제하는 DDL, CREATE, ALTER, DROP에 대해 정리했습니다.
이번 글에서는 데이터베이스 사용자에게 권한을 부여하거나 회수하는 DCL(Data Control Language)에 대해 정리해 보겠습니다.
DCL은 데이터베이스 보안과 접근 제어에 관련된 SQL 명령어입니다. 쉽게 말하면 누가 어떤 데이터에 접근할 수 있는지, 누가 어떤 작업을 할 수 있는지를 관리하는 명령어입니다.
1. SQL 명령어 분류 다시 보기
SQL 명령어는 역할에 따라 여러 종류로 나눌 수 있습니다.
| 분류 | 의미 | 대표 명령어 |
|---|---|---|
| DQL | 데이터 조회 | SELECT |
| DML | 데이터 조작 | INSERT, UPDATE, DELETE |
| DDL | 데이터 구조 정의 | CREATE, ALTER, DROP, TRUNCATE |
| TCL | 트랜잭션 제어 | COMMIT, ROLLBACK, SAVEPOINT |
| DCL | 권한 제어 | GRANT, REVOKE |
이번 글에서 다룰 DCL은 사용자 권한을 관리하는 명령어입니다. 대표적으로 GRANT와 REVOKE가 있습니다.
2. DCL이란?
DCL은 Data Control Language의 약자로, 데이터베이스 사용자의 권한을 부여하거나 회수하는 SQL 명령어입니다.
DCL은 데이터베이스 객체에 대한 접근 권한을 제어하는 명령어이다.
DCL의 대표 명령어는 다음과 같습니다.
| 명령어 | 역할 |
|---|---|
| GRANT | 사용자에게 권한을 부여한다. |
| REVOKE | 사용자에게 부여된 권한을 회수한다. |
3. 권한 관리가 필요한 이유
데이터베이스에는 중요한 데이터가 저장됩니다. 회원 정보, 주문 정보, 결제 정보, 개인정보처럼 민감한 데이터도 많습니다.
모든 사용자가 모든 테이블을 조회하고 수정할 수 있다면 보안 문제가 발생할 수 있습니다. 따라서 사용자별로 필요한 권한만 부여해야 합니다.
- 개발자는 테스트 테이블을 생성할 수 있다.
- 운영자는 주문 데이터를 조회할 수 있다.
- 일반 사용자는 자신의 데이터만 조회할 수 있다.
- 분석가는 매출 데이터를 조회할 수 있지만 수정은 할 수 없다.
- 관리자는 사용자 권한을 부여하거나 회수할 수 있다.
이처럼 권한 관리는 데이터베이스 보안과 데이터 무결성을 지키기 위해 꼭 필요합니다.
4. 사용자, 스키마, 객체
DCL을 이해하려면 사용자, 스키마, 객체의 개념을 함께 알아두면 좋습니다.
| 개념 | 설명 |
|---|---|
| 사용자 | 데이터베이스에 접속하는 계정 |
| 스키마 | 사용자가 소유한 데이터베이스 객체들의 집합 |
| 객체 | 테이블, 뷰, 인덱스, 시퀀스 등 데이터베이스 안의 구조물 |
Oracle에서는 사용자와 스키마가 밀접하게 연결되어 있습니다. 사용자가 생성한 테이블, 뷰, 인덱스 등이 그 사용자의 스키마에 속한다고 볼 수 있습니다.
5. 권한이란?
권한(Privilege)은 사용자가 데이터베이스에서 특정 작업을 수행할 수 있는 자격입니다.
권한은 사용자가 데이터베이스 객체나 기능을 사용할 수 있도록 허용된 범위이다.
예를 들어 어떤 사용자는 회원 테이블을 조회할 수 있지만 수정은 못 하게 할 수 있습니다. 또 다른 사용자는 테이블을 생성할 수 있지만 다른 사용자의 테이블은 삭제하지 못하게 할 수 있습니다.
6. 권한의 종류
권한은 크게 시스템 권한과 객체 권한으로 나눌 수 있습니다.
| 구분 | 설명 | 예시 |
|---|---|---|
| 시스템 권한 | 데이터베이스 시스템 수준의 작업 권한 | CREATE SESSION, CREATE TABLE |
| 객체 권한 | 특정 객체에 대한 작업 권한 | SELECT, INSERT, UPDATE, DELETE |
시스템 권한은 데이터베이스에 접속하거나 객체를 생성하는 권한이고, 객체 권한은 특정 테이블이나 뷰 같은 객체에 접근하는 권한입니다.
7. 시스템 권한
시스템 권한은 데이터베이스 시스템 전체에서 특정 작업을 수행할 수 있는 권한입니다.
대표적인 시스템 권한은 다음과 같습니다.
| 시스템 권한 | 설명 |
|---|---|
| CREATE SESSION | 데이터베이스에 접속할 수 있는 권한 |
| CREATE TABLE | 자신의 스키마에 테이블을 생성할 수 있는 권한 |
| CREATE VIEW | 뷰를 생성할 수 있는 권한 |
| CREATE SEQUENCE | 시퀀스를 생성할 수 있는 권한 |
| CREATE USER | 사용자를 생성할 수 있는 권한 |
예를 들어 어떤 사용자가 데이터베이스에 로그인하려면 CREATE SESSION 권한이 필요할 수 있습니다.
8. 객체 권한
객체 권한은 특정 테이블, 뷰, 시퀀스 같은 객체에 대해 수행할 수 있는 권한입니다.
대표적인 객체 권한은 다음과 같습니다.
| 객체 권한 | 설명 |
|---|---|
| SELECT | 테이블이나 뷰를 조회할 수 있는 권한 |
| INSERT | 테이블에 데이터를 입력할 수 있는 권한 |
| UPDATE | 테이블의 데이터를 수정할 수 있는 권한 |
| DELETE | 테이블의 데이터를 삭제할 수 있는 권한 |
| REFERENCES | 다른 테이블에서 외래키로 참조할 수 있는 권한 |
| EXECUTE | 프로시저나 함수를 실행할 수 있는 권한 |
예를 들어 분석 담당자에게 회원 테이블 조회 권한만 부여하고, 수정이나 삭제 권한은 주지 않을 수 있습니다.
9. GRANT란?
GRANT는 사용자나 역할에게 권한을 부여할 때 사용하는 DCL 명령어입니다.
GRANT는 사용자에게 특정 권한을 부여하는 명령어이다.
기본 구조는 다음과 같습니다.
GRANT 권한
TO 사용자;
객체 권한을 부여할 때는 어떤 객체에 대한 권한인지 함께 지정합니다.
GRANT 권한
ON 객체명
TO 사용자;
10. 시스템 권한 부여하기
사용자 USER_A에게 데이터베이스 접속 권한을 부여해 보겠습니다.
GRANT CREATE SESSION
TO USER_A;
위 SQL은 USER_A에게 데이터베이스에 접속할 수 있는 권한을 부여합니다.
사용자에게 테이블 생성 권한을 부여하려면 다음과 같이 작성할 수 있습니다.
GRANT CREATE TABLE
TO USER_A;
이제 USER_A는 자신의 스키마에 테이블을 생성할 수 있습니다.
11. 여러 시스템 권한 한 번에 부여하기
여러 권한을 한 번에 부여할 수도 있습니다.
GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW
TO USER_A;
위 SQL은 USER_A에게 접속 권한, 테이블 생성 권한, 뷰 생성 권한을 함께 부여합니다.
12. 객체 권한 부여하기
USER_A에게 회원 테이블 조회 권한을 부여해 보겠습니다.
GRANT SELECT
ON 회원
TO USER_A;
위 SQL은 USER_A가 회원 테이블을 조회할 수 있도록 권한을 부여합니다.
만약 USER_A에게 회원 테이블에 데이터를 입력할 수 있는 권한도 주고 싶다면 다음과 같이 작성할 수 있습니다.
GRANT INSERT
ON 회원
TO USER_A;
13. 여러 객체 권한 한 번에 부여하기
하나의 객체에 대해 여러 권한을 한 번에 부여할 수 있습니다.
GRANT SELECT, INSERT, UPDATE
ON 회원
TO USER_A;
위 SQL은 USER_A에게 회원 테이블에 대한 조회, 입력, 수정 권한을 부여합니다.
삭제 권한은 부여하지 않았으므로 USER_A는 회원 테이블의 데이터를 삭제할 수 없습니다.
14. 컬럼 단위 UPDATE 권한
일부 DBMS에서는 특정 컬럼에 대해서만 UPDATE 권한을 부여할 수 있습니다. Oracle에서는 UPDATE 권한을 컬럼 단위로 제한할 수 있습니다.
GRANT UPDATE (회원등급)
ON 회원
TO USER_A;
위 SQL은 USER_A가 회원 테이블의 회원등급 컬럼만 수정할 수 있도록 권한을 부여합니다.
이렇게 하면 이름, 이메일 같은 다른 컬럼은 수정하지 못하게 제한할 수 있습니다.
15. WITH GRANT OPTION
WITH GRANT OPTION은 객체 권한을 받은 사용자가 그 권한을 다른 사용자에게 다시 부여할 수 있도록 허용하는 옵션입니다.
GRANT SELECT
ON 회원
TO USER_A
WITH GRANT OPTION;
위 SQL을 실행하면 USER_A는 회원 테이블을 조회할 수 있을 뿐만 아니라, 다른 사용자에게도 회원 테이블 조회 권한을 부여할 수 있습니다.
GRANT SELECT
ON 회원
TO USER_B;
이처럼 권한을 다시 부여할 수 있으므로 WITH GRANT OPTION은 신중하게 사용해야 합니다.
16. WITH ADMIN OPTION
WITH ADMIN OPTION은 시스템 권한이나 역할을 받은 사용자가 해당 권한이나 역할을 다른 사용자에게 다시 부여할 수 있게 하는 옵션입니다.
GRANT CREATE TABLE
TO USER_A
WITH ADMIN OPTION;
위 SQL은 USER_A에게 CREATE TABLE 권한을 부여하면서, USER_A가 이 권한을 다른 사용자에게 부여할 수 있도록 허용합니다.
정리하면 다음과 같이 이해할 수 있습니다.
| 옵션 | 주로 사용되는 대상 | 의미 |
|---|---|---|
| WITH GRANT OPTION | 객체 권한 | 받은 객체 권한을 다른 사용자에게 다시 부여 가능 |
| WITH ADMIN OPTION | 시스템 권한, 역할 | 받은 시스템 권한이나 역할을 다른 사용자에게 다시 부여 가능 |
17. REVOKE란?
REVOKE는 사용자에게 부여된 권한을 회수할 때 사용하는 DCL 명령어입니다.
REVOKE는 사용자에게 부여된 권한을 제거하는 명령어이다.
기본 구조는 다음과 같습니다.
REVOKE 권한
FROM 사용자;
객체 권한을 회수할 때는 어떤 객체에 대한 권한인지 함께 지정합니다.
REVOKE 권한
ON 객체명
FROM 사용자;
18. 시스템 권한 회수하기
USER_A에게 부여했던 테이블 생성 권한을 회수해 보겠습니다.
REVOKE CREATE TABLE
FROM USER_A;
위 SQL을 실행하면 USER_A는 더 이상 CREATE TABLE 권한을 사용할 수 없습니다.
데이터베이스 접속 권한을 회수하려면 다음과 같이 작성할 수 있습니다.
REVOKE CREATE SESSION
FROM USER_A;
19. 객체 권한 회수하기
USER_A에게 부여했던 회원 테이블 조회 권한을 회수해 보겠습니다.
REVOKE SELECT
ON 회원
FROM USER_A;
위 SQL을 실행하면 USER_A는 더 이상 회원 테이블을 SELECT할 수 없습니다.
여러 객체 권한을 한 번에 회수할 수도 있습니다.
REVOKE SELECT, INSERT, UPDATE
ON 회원
FROM USER_A;
20. 권한 회수 시 주의사항
권한을 회수하면 해당 사용자가 수행하던 작업에 영향을 줄 수 있습니다. 예를 들어 애플리케이션 계정에서 SELECT 권한을 회수하면 프로그램이 정상적으로 데이터를 조회하지 못할 수 있습니다.
따라서 REVOKE를 실행하기 전에는 다음을 확인하는 것이 좋습니다.
- 해당 사용자가 실제로 그 권한을 사용하고 있는가?
- 권한 회수 후 프로그램 오류가 발생하지 않는가?
- 다른 사용자에게 다시 부여된 권한이 있는가?
- 운영 업무에 영향이 없는가?
21. ROLE이란?
ROLE은 여러 권한을 하나로 묶어 관리하는 권한 그룹입니다.
ROLE은 여러 권한을 묶어서 사용자에게 한 번에 부여할 수 있는 권한 묶음이다.
사용자가 많아질수록 권한을 개별적으로 부여하고 회수하는 것은 번거롭습니다. 이럴 때 역할을 만들어 권한을 묶어두면 관리가 쉬워집니다.
22. ROLE이 필요한 이유
예를 들어 조회 전용 사용자 10명에게 회원, 주문, 상품 테이블의 SELECT 권한을 부여해야 한다고 해보겠습니다. 사용자마다 권한을 하나씩 부여하면 관리가 복잡합니다.
이럴 때 조회 전용 역할을 만들고, 그 역할에 필요한 권한을 부여한 뒤, 사용자에게 역할을 부여하면 됩니다.
- ROLE_READ_ONLY 역할 생성
- ROLE_READ_ONLY에 SELECT 권한 부여
- 여러 사용자에게 ROLE_READ_ONLY 부여
역할을 사용하면 권한 관리가 훨씬 단순해집니다.
23. ROLE 생성과 권한 부여
역할을 생성하는 명령어는 CREATE ROLE입니다.
CREATE ROLE ROLE_READ_ONLY;
생성한 역할에 회원 테이블 조회 권한을 부여할 수 있습니다.
GRANT SELECT
ON 회원
TO ROLE_READ_ONLY;
주문 테이블 조회 권한도 부여할 수 있습니다.
GRANT SELECT
ON 주문
TO ROLE_READ_ONLY;
이제 사용자에게 역할을 부여합니다.
GRANT ROLE_READ_ONLY
TO USER_A;
USER_A는 ROLE_READ_ONLY 역할을 통해 회원과 주문 테이블을 조회할 수 있습니다.
24. ROLE 권한 회수
사용자에게 부여된 역할을 회수할 수도 있습니다.
REVOKE ROLE_READ_ONLY
FROM USER_A;
위 SQL을 실행하면 USER_A는 ROLE_READ_ONLY 역할을 잃게 됩니다. 따라서 그 역할을 통해 사용하던 권한도 사용할 수 없게 됩니다.
25. ROLE의 장점
ROLE을 사용하면 권한 관리가 효율적입니다.
| 장점 | 설명 |
|---|---|
| 관리 편의성 | 여러 권한을 하나의 역할로 묶어 관리할 수 있다. |
| 일관성 | 같은 업무를 하는 사용자에게 동일한 권한을 쉽게 부여할 수 있다. |
| 변경 용이성 | 역할에 권한을 추가하거나 제거하면 관련 사용자에게 일괄 반영할 수 있다. |
| 보안 관리 | 업무별 권한을 분리해 최소 권한 원칙을 적용할 수 있다. |
26. PUBLIC 권한
PUBLIC은 모든 사용자를 의미합니다. 어떤 권한을 PUBLIC에 부여하면 모든 사용자가 해당 권한을 사용할 수 있습니다.
GRANT SELECT
ON 공지사항
TO PUBLIC;
위 SQL은 모든 사용자가 공지사항 테이블을 조회할 수 있도록 권한을 부여하는 예시입니다.
하지만 PUBLIC에 권한을 부여하면 전체 사용자에게 영향을 주므로 신중하게 사용해야 합니다. 특히 민감한 데이터에는 PUBLIC 권한을 부여하지 않는 것이 좋습니다.
27. 최소 권한 원칙
권한 관리에서 중요한 원칙 중 하나는 최소 권한 원칙입니다.
최소 권한 원칙은 사용자가 업무 수행에 필요한 최소한의 권한만 가지도록 하는 보안 원칙이다.
예를 들어 데이터 분석가에게는 SELECT 권한만 필요할 수 있습니다. 그런데 INSERT, UPDATE, DELETE 권한까지 부여하면 실수로 데이터를 변경할 위험이 생깁니다.
| 사용자 유형 | 필요 권한 예시 |
|---|---|
| 분석가 | SELECT |
| 운영 담당자 | SELECT, UPDATE |
| 개발자 | CREATE TABLE, SELECT, INSERT, UPDATE, DELETE |
| 관리자 | 사용자 및 권한 관리 권한 |
권한은 넉넉하게 주는 것보다 필요한 만큼만 주는 것이 안전합니다.
28. DCL과 보안
DCL은 데이터베이스 보안의 기본이 됩니다. 데이터베이스에 접근할 수 있는 사용자와 작업 범위를 통제하기 때문입니다.
권한 관리가 제대로 되지 않으면 다음과 같은 문제가 발생할 수 있습니다.
- 중요 데이터가 외부로 노출될 수 있다.
- 잘못된 사용자가 데이터를 수정할 수 있다.
- 실수로 데이터가 삭제될 수 있다.
- 업무별 책임 구분이 어려워질 수 있다.
- 보안 사고 발생 시 추적이 어려워질 수 있다.
따라서 데이터베이스 운영에서는 사용자별, 업무별로 권한을 적절히 분리하는 것이 중요합니다.
29. DCL, DDL, DML 비교
DCL은 DDL, DML과 역할이 다릅니다. 세 가지를 비교하면 다음과 같습니다.
| 구분 | 대상 | 목적 | 대표 명령어 |
|---|---|---|---|
| DML | 테이블의 데이터 | 데이터 입력, 수정, 삭제 | INSERT, UPDATE, DELETE |
| DDL | 데이터베이스 객체 구조 | 객체 생성, 변경, 삭제 | CREATE, ALTER, DROP |
| DCL | 사용자 권한 | 권한 부여, 권한 회수 | GRANT, REVOKE |
간단히 정리하면, DML은 데이터 내용, DDL은 객체 구조, DCL은 권한을 다룹니다.
30. DCL에서 자주 하는 실수
| 실수 | 주의할 점 |
|---|---|
| 필요 이상으로 많은 권한 부여 | 최소 권한 원칙을 지켜야 한다. |
| PUBLIC에 민감한 객체 권한 부여 | 모든 사용자에게 권한이 열릴 수 있다. |
| WITH GRANT OPTION을 무분별하게 사용 | 권한이 예상보다 넓게 퍼질 수 있다. |
| 권한 회수 전 영향 범위 미확인 | 운영 프로그램이나 사용자 업무에 문제가 생길 수 있다. |
| ROLE 없이 사용자별로 권한을 개별 관리 | 사용자가 많아지면 관리가 어려워진다. |
31. SQLD 관점에서 꼭 기억할 내용
이번 글에서 SQLD 공부를 위해 꼭 기억해야 할 내용은 다음과 같습니다.
- DCL은 사용자 권한을 제어하는 SQL 명령어이다.
- GRANT는 권한을 부여하는 명령어이다.
- REVOKE는 권한을 회수하는 명령어이다.
- 권한은 시스템 권한과 객체 권한으로 나눌 수 있다.
- 시스템 권한은 데이터베이스 시스템 수준의 작업 권한이다.
- 객체 권한은 특정 테이블, 뷰 등에 대한 작업 권한이다.
- WITH GRANT OPTION은 객체 권한을 다른 사용자에게 다시 부여할 수 있게 한다.
- WITH ADMIN OPTION은 시스템 권한이나 역할을 다른 사용자에게 다시 부여할 수 있게 한다.
- ROLE은 여러 권한을 묶어 관리하는 권한 그룹이다.
- PUBLIC은 모든 사용자를 의미한다.
- 권한은 필요한 만큼만 부여하는 최소 권한 원칙이 중요하다.
32. 핵심 요약
| 개념 | 핵심 내용 |
|---|---|
| DCL | 데이터베이스 권한을 제어하는 명령어 |
| GRANT | 사용자나 역할에게 권한을 부여한다. |
| REVOKE | 사용자나 역할에게 부여된 권한을 회수한다. |
| 시스템 권한 | 데이터베이스 시스템 수준의 작업 권한 |
| 객체 권한 | 특정 객체에 대한 SELECT, INSERT, UPDATE, DELETE 등의 권한 |
| ROLE | 여러 권한을 묶어 관리하는 권한 그룹 |
| PUBLIC | 모든 사용자를 의미한다. |
| 최소 권한 원칙 | 업무에 필요한 최소한의 권한만 부여하는 원칙 |
33. 마무리
이번 글에서는 데이터베이스 권한을 관리하는 DCL에 대해 정리했습니다.
DCL은 사용자가 데이터베이스에서 어떤 작업을 할 수 있는지 제어하는 명령어입니다. GRANT는 권한을 부여하고, REVOKE는 부여된 권한을 회수합니다.
권한은 크게 시스템 권한과 객체 권한으로 나눌 수 있습니다. 시스템 권한은 데이터베이스 접속이나 객체 생성처럼 시스템 수준의 작업을 제어하고, 객체 권한은 특정 테이블이나 뷰에 대한 SELECT, INSERT, UPDATE, DELETE 같은 작업을 제어합니다.
SQLD에서는 GRANT와 REVOKE의 역할, 시스템 권한과 객체 권한의 차이, ROLE의 개념, WITH GRANT OPTION과 WITH ADMIN OPTION의 차이를 잘 기억해두면 좋습니다.
다음 글에서는 데이터베이스 작업의 안정성을 보장하는 핵심 개념인 트랜잭션과 ACID에 대해 정리해 보겠습니다.

'Computer Science > Database' 카테고리의 다른 글
| [DB] 데이터베이스 개념노트 16편 - 인덱스(Index) (0) | 2026.04.11 |
|---|---|
| [DB] 데이터베이스 개념노트 15편 - 트랜잭션과 ACID (0) | 2026.02.13 |
| [DB] 데이터베이스 개념노트 13편 - DDL, CREATE, ALTER, DROP (0) | 2026.02.13 |
| [DB] 데이터베이스 개념노트 12편 - INSERT, UPDATE, DELETE (0) | 2026.02.07 |
| [DB] 데이터베이스 개념노트 11편 - JOIN (0) | 2026.02.07 |