데이터베이스 보안은 시스템 관리의 핵심 요소이다. 오라클 데이터베이스에서는 DCL(Data Control Language) 명령어를 통해 사용자 권한을 세밀하게 제어할 수 있다. DCL의 핵심인 GRANT와 REVOKE를 통해 어떻게 오라클 데이터베이스 객체에 접근 사용자 권한을 통제하고 관리하는지 알아보자.
1. DCL의 기본 개념과 중요성
1.1 DCL이란 무엇인가?
DCL(Data Control Language)은 데이터베이스 보안, 무결성, 권한 관리를 위한 SQL 명령어 집합이다. 주요 DCL 명령어는 다음과 같다:
- GRANT: 사용자나 롤(Role)에게 권한을 부여
- REVOKE: 사용자나 롤에게서 부여한 권한을 회수
1.2 데이터베이스 보안의 중요성
데이터베이스 보안이 중요한 이유는 다음과 같다:
- 민감한 정보 보호(개인정보, 금융 데이터 등)
- 내부자 위협 방지
- 규제 준수(GDPR, 개인정보보호법 등)
- 데이터 무결성 유지
- 비즈니스 연속성 보장
1.3 오라클 권한 모델 이해하기
오라클의 권한 모델은 크게 시스템 권한과 객체 권한으로 구분된다:
- 시스템 권한: 데이터베이스 전체에 영향을 미치는 작업을 수행할 수 있는 권한
- 객체 권한: 특정 데이터베이스 객체에 대한 작업 권한
- 롤(Role): 여러 권한을 묶어서 관리하는 단위
2. GRANT 구문: 사용자나 객체에 권한 부여하는 명령어
2.1 시스템 권한 부여
시스템 권한은 데이터베이스 전체 수준의 작업을 수행할 수 있는 권한이다.
GRANT system_privilege [, system_privilege...]
TO user_or_role [, user_or_role...]
[WITH ADMIN OPTION];
주요 시스템 권한 부여 예시:
-- 연결 권한 부여
GRANT CREATE SESSION TO app_user;
-- 테이블 생성 권한 부여
GRANT CREATE TABLE TO app_user;
-- 뷰 생성 권한 부여
GRANT CREATE VIEW TO app_user;
-- 프로시저 생성 권한 부여
GRANT CREATE PROCEDURE TO app_user;
-- 사용자 생성 권한 부여 (DBA 권한 필요)
GRANT CREATE USER TO admin_user WITH ADMIN OPTION;
-- 여러 권한 한 번에 부여
GRANT CREATE SESSION, CREATE TABLE, CREATE SEQUENCE TO app_developer;
-- 테이블스페이스 사용 권한
GRANT UNLIMITED TABLESPACE TO app_user;
WITH ADMIN OPTION
을 추가하면 권한을 받은 사용자가 다른 사용자에게 해당 권한을 부여할 수 있다. app_user
와 admin_user
는 실제 환경에서 사용하는 사용자 이름으로 변경해야 한다.
2.2 객체 권한 부여
객체 권한은 특정 데이터베이스 객체(테이블, 뷰, 시퀀스 등)에 대한 작업 권한이다.
GRANT object_privilege [(column [, column...])] [, object_privilege...]
ON [schema.]object
TO user_or_role [, user_or_role...]
[WITH GRANT OPTION];
주요 객체 권한 부여 예시:
-- 테이블에 대한 SELECT 권한 부여
GRANT SELECT ON hr.employees TO app_user;
-- 테이블에 대한 INSERT, UPDATE, DELETE 권한 부여
GRANT INSERT, UPDATE, DELETE ON hr.departments TO app_user;
-- 특정 열에 대한 UPDATE 권한 부여
GRANT UPDATE (first_name, last_name, email) ON hr.employees TO app_user;
-- 모든 권한 부여
GRANT ALL ON hr.departments TO app_admin;
-- 다른 사용자에게 부여할 수 있는 권한까지 함께 부여
GRANT SELECT ON hr.employees TO app_user WITH GRANT OPTION;
-- 시퀀스 사용 권한
GRANT SELECT ON hr.employees_seq TO app_user;
-- 프로시저 실행 권한
GRANT EXECUTE ON hr.calculate_bonus TO app_user;
-- 디렉토리 객체 권한
GRANT READ, WRITE ON DIRECTORY data_pump_dir TO app_user;
WITH GRANT OPTION
을 추가하면 권한을 받은 사용자가 다른 사용자에게 해당 객체 권한을 부여할 수 있다. hr.employees
, hr.departments
등은 실제 스키마와 객체 이름으로 변경해야 한다.
2.3 롤(Role)을 통한 권한 관리
여러 권한을 묶어서 관리하려면 롤을 사용하는 것이 편리하다.
-- 롤 생성
CREATE ROLE app_read_role;
-- 롤에 시스템 권한 부여
GRANT CREATE SESSION, SELECT ANY DICTIONARY TO app_read_role;
-- 롤에 객체 권한 부여
GRANT SELECT ON hr.employees TO app_read_role;
GRANT SELECT ON hr.departments TO app_read_role;
-- 사용자에게 롤 부여
GRANT app_read_role TO app_user1, app_user2, app_user3;
-- 롤에 롤 부여(중첩)
CREATE ROLE junior_dev_role;
GRANT app_read_role TO junior_dev_role;
GRANT CREATE TABLE TO junior_dev_role;
오라클에서 제공하는 주요 기본 롤:
-- 기본 연결 권한
GRANT CONNECT TO app_user;
-- 개발자 권한 (테이블, 뷰, 시퀀스 등 생성 가능)
GRANT RESOURCE TO app_user;
-- 관리자 권한 (주의: 운영 환경에서는 신중하게 부여)
GRANT DBA TO admin_user;
2.4 자주 사용되는 권한 조합 예시
실무에서 자주 사용되는 권한 조합을 알아보자.
-- 읽기 전용 사용자 생성
CREATE USER read_only_user IDENTIFIED BY password;
GRANT CREATE SESSION TO read_only_user;
GRANT SELECT ANY TABLE TO read_only_user;
-- 애플리케이션 사용자 설정
CREATE USER app_user IDENTIFIED BY password;
GRANT CREATE SESSION TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON app_schema.customers TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON app_schema.orders TO app_user;
GRANT SELECT ON app_schema.products TO app_user;
GRANT EXECUTE ON app_schema.process_order TO app_user;
-- 개발자 권한 설정
CREATE USER developer IDENTIFIED BY password;
GRANT CONNECT, RESOURCE TO developer;
GRANT SELECT ANY TABLE, INSERT ANY TABLE, UPDATE ANY TABLE, DELETE ANY TABLE TO developer;
GRANT CREATE VIEW, CREATE SYNONYM TO developer;
ALTER USER developer QUOTA UNLIMITED ON users;
3. REVOKE 구문: 사용자나 객체에서 권한 회수하는 명령어
3.1 시스템 권한 회수
REVOKE system_privilege [, system_privilege...]
FROM user_or_role [, user_or_role...];
예시:
-- 테이블 생성 권한 회수
REVOKE CREATE TABLE FROM app_user;
-- 여러 권한 동시 회수
REVOKE CREATE VIEW, CREATE PROCEDURE FROM app_user;
-- 관리자 옵션만 회수 (권한은 유지)
REVOKE ADMIN OPTION FOR CREATE USER FROM admin_user;
3.2 객체 권한 회수
REVOKE [GRANT OPTION FOR] object_privilege [, object_privilege...]
ON [schema.]object
FROM user_or_role [, user_or_role...];
예시:
-- SELECT 권한 회수
REVOKE SELECT ON hr.employees FROM app_user;
-- 여러 객체 권한 동시 회수
REVOKE INSERT, UPDATE, DELETE ON hr.departments FROM app_user;
-- GRANT OPTION만 회수 (권한은 유지)
REVOKE GRANT OPTION FOR SELECT ON hr.employees FROM app_user;
-- 모든 권한 회수
REVOKE ALL ON hr.departments FROM app_user;
-- 특정 열에 대한 권한 회수
REVOKE UPDATE (salary, commission_pct) ON hr.employees FROM app_user;
3.3 롤(Role) 회수
사용자로부터 롤을 회수할 수도 있다.
REVOKE role_name FROM user_or_role;
예시:
-- 단일 롤 회수
REVOKE app_read_role FROM app_user;
-- 여러 롤 동시 회수
REVOKE junior_dev_role, senior_dev_role FROM developer;
-- 기본 롤 회수
REVOKE RESOURCE FROM developer_user;
3.4 CASCADE 옵션
CASCADE CONSTRAINTS 옵션은 관련된 제약 조건도 함께 삭제한다. (객체 삭제 시)
DROP TABLE employees CASCADE CONSTRAINTS;
오라클 데이터베이스에서 DCL 구문(GRANT, REVOKE)은 데이터 보안과 직결된다. 항상 명심하자, 사용자에게는 필요한 최소한의 권한만 부여하여야 한다는 사실을!