데이터베이스에 저장된 데이터는 조직을 운영하는데 꼭 필요한 것으로, 조직 내 사용자들이 공유하여 사용한다. 만약 사용이 허락되지 않은 외부인이 데이터베이스에 침입하여 데이터를 유출하거나 손상한다면, 조직에 치명적인 손실이 발생할 수 있다. 그러므로 조직에서 허가한 사용자만 데이터베이스에 접근할 수 있도록 통제하는 것은 매우 중요하다.
데이터베이스의 보안을 유지하여 데이터를 보호하는 방법은 일반적으로 다음 세 가지 유형으로 분류한다.
데이터베이스 관리 시스템은 데이터베이스의 보안을 유지하기 위해, 계정이 발급된 사용자가 로그인에 성공했을 경우에만 데이터베이스 접근이 가능하도록 접근 제어 기능을 기본으로 제공한다. 즉 모든 사용자는 자신에게 발급된 계정으로 로그인해야 데이터베이스에 접근할 수 있다.
로그인을 통해 데이터베이스에 접근할 수 있더라도, 데이터베이스 안에 있는 모든 데이터를 사용할 수 있는 것은 아니다. 데이터베이스 관리 시스템이 사용자별로 데이터베이스의 사용 범위와 수행 가능한 작업을 제한할 수 있어, 각 사용자는 자신에게 허용된 권한 내에서만 데이터베이스를 사용할 수 있다.
테이블이나 뷰와 같이 데이터베이스에 존재하는 모든 객체는 기본적으로 해당 객체를 생성한 사용자만 사용 권한을 가지게 된다. 즉, 객체가 사용자별로 관리되므로 데이터베이스에 접근이 허락된 사용자일지라도 자신이 생성하지 않은 객체는 사용할 수 없다.
그러나 데이터베이스는 여러 사용자가 공유해서 사용할 목적으로 만들어진 것이므로, 다른 사용자가 생성한 객체에도 필요에 따라 접근할 수 있어야 한다. SQL문을 이용하면 다른 사용자에게 자신이 생성한 객체에 대한 적절한 수준의 사용 권한을 부여하거나 취소할 수 있다.
객체의 소유자가 다른 사용자에게 객체에 대한 사용 권한을 부여하기 위해 필요한 SQL 명령어는 GRANT다.
GRANT 권한 ON 객체 TO 사용자 [WITH GRANT OPTION];
데이터베이스에 존재하는 모든 유형의 객체에 다른 사용자 권한을 부여할 수 있다. 하지만 일반적으로 테이블에 권한을 부여하는 경우가 많으므로, 여기서는 테이블을 대상으로 하는 권한 부여를 중심으로 설명한다.
테이블과 관련하여 다른 사용자에게 부여할 수 있는 주요 권한으로는 INSERT, DELETE, UPDATE, SELECT, REFERENCES가 있는데, 여러 권한을 한번에 동시에 부여할 수도 있다.
GRANT는 기본적으로 테이블을 구성하는 모든 속성에 권한을 부여하지만, UPDATE와 SELECT는 테이블을 구성하는 속성들 중 일부 속성만 수정 또는 검색하는 권한을 부여할 수도 있다.
또한, 일반적으로 GRANT로 권한을 부여받은 사용자는, 자신이 부여받은 권한을 다른 사용자에게 줄 수 없지만 PULIC 키워드를 이용하면 가능해진다.
GRANT 문을 이용해 테이블에 대한 사용 권한을 부여하는 예제를 몇 개 살펴보자.
고객 테이블의 소유자는 Birdie라 가정한다.
고객 테이블에 대한 검색 권한을 사용자 Mong에게 부여해보자.
GRANT SELECT ON 고객 TO Mong;
고객 테이블에 대한 삽입과 삭제 권한을 모든 사용자에게 부여해보자.
GRANT INSERT, DELETE ON 고객 TO PUBLIC;
테이블을 생성할 수 있는 시스템 권한을 사용자 Roy에게 부여해보자 .
GRANT CREATE TABLE TO Roy;
뷰를 생성할 수 있는 시스템 권한을 사용자 Core에게 부여해보자.
GRANT CREATE VIEW TO Core;
GRANT 명령어를 통해 다른 사용자에게 권한을 부여한 사용자가 자신이 부여한 권한을 취소할 수도 있다. 다른 사용자에게 부여된 객체의 사용 권한을 취소하기 위해 필요한 SQL 명령어는 REVOKE다.
REVOKE 권한 ON 개체 FROM 사용자 CASCADE | RESTRICT;
위의 그림에서 Kim이 REVOKE문을 통해 Hong에게 부여한 고객 테이블에 대한 검색 권한을 취소한다면 Park에게 부여된 검색 권한은 어떻게 처리해야 할까?
이는 REVOKE문을 작성할 때 선택할 수 있다. 권한을 취소할 사용자 A가 사용자 B뿐 아니라 C에게 부여한 권한도 연쇄적으로 함께 취소하고자 한다면, REVOKE문을 작성할 때 CASCADE옵션을 지정하면 된다. 반면, 권한을 취소할 사용자 A가 사용자 C에게 부여한 권한은 취소하지 않도록 하려면 RESTRICT 옵션을 지정한다.
Kim이 Hong에게 부여한 고객 테이블에 대한 검색 권한을 취소하면서 Hong이 다른 사용자에게 부여한 고객 테이블에 대한 검색 권한도 함께 취소해보자.
REVOKE SELECT ON 고객 FROM Hong CASCADE;
데이터베이스 객체의 소유자는 조직의 업무를 수행하기 위해 자신이 소유한 객체에 대한 권한들을 여러 사용자에게 부여하는 경우가 많다. 이때 여러 권한을 사용자에게 부여한다면, 모든 사용자마다 GRANT문을 작성해야할 것이다. 여러 사용자들ㄹ에게 동일한 권한을 부여하고 취소하는 번거로운 작업을 편리하게 수행할 수 있도록 도움을 주는 것이 역할이다.
새로운 역할을 생성하는 기능은 데이터베이스 관리자가 담당한다.
역할을 생성한는데 필요한 SQL 명령어는 CREATE ROLE 이다.
CREATE ROLE 롤이름;
여기서 역할에게 권한을 부여해 보자.
GRANT 권한 ON 객체 TO 롤이름;
생성한 역할을 사용자에게 부여하는 형식은 다음과 같다.
GRANT 롤이름 TO 사용자