저장 프로시저의 권한¶
이 장에서는 저장 프로시저를 호출하기 위해 필요한 권한과 다른 사용자에게 프로시저에 대한 호출 권한을 부여하는 방법에 대하여 자세히 설명한다. 또한 호출 시 어떤 사용자의 권한으로 호출하는지 명시하는 소유자 권한과 호출자 권한의 차이에 대하여 자세히 설명한다.
소유자 권한과 호출자 권한의 차이¶
프로시저의 호출 권한을 가지면, 해당 프로시저를 실행할 때 어떠한 사용자의 권한으로 실행될지 명시할 수 있다. 저장 프로시저와 저장 함수는 소유자 권한 또는 호출자 권한으로 실행될 수 있다. 실행 권한은 저장 프로시저 또는 저장함수 생성시 둘 중 하나를 선택하여 생성할 수 있으며, 지정한 권한으로 실행된다.
다음은 각 권한에 대한 설명과 차이점을 설명한다.
- 소유자 권한 (Owner’s Rights 또는 Definer’s Rights)
저장 프로시저를 만든 사용자의 권한으로 실행된다.
저장 프로시저를 만든 사용자가 다른 사용자에게 권한을 부여하면 부여된 사용자도 저장 프로시저를 실행할 수 있다.
저장 프로시저의 소유자의 모든 권한을 사용 가능하므로 별도의 권한 부여 없이 소유자가 접근할 수 있는 데이터베이스 객체에 접근할 수 있다. DBA의 소유자 권한으로 저장 프로시저를 만들면 모든 데이터베이스 객체에 접근할 수 있으므로 특히 동적 SQL(Dynamic SQL)을 사용할 때 SQL 인젝션(SQL Injection)과 같은 보안 문제에 주의해야 한다.
공통적인 작업이나 데이터 접근을 필요로 하는데 적합하다.
반면에 호출자 권한은 다음과 같다.
- 호출자 권한 (Caller’s Rights 또는 Invoker’s Rights)
저장 프로시저를 만든 사용자의 권한이 아닌 호출자의 권한으로 실행된다.
호출자 권한으로 저장 프로시저를 만들고 다른 유저에게 권한을 부여하면, 저장 프로시저를 호출하는 사용자의 권한으로 실행된다.
호출자 권한으로 저장 프로시저를 만들면 저장 프로시저를 만든 사용자의 권한이 아닌 호출자의 권한 수준에서 실행되므로 호출자의 권한으로 데이터베이스 객체에 접근할 수 있다. 따라서 호출자 권한으로 저장 프로시저를 만들 때는 호출자의 권한 수준을 고려하여 저장 프로시저를 만들어야 한다.
호출자별로 권한을 다르게 적용해야할 경우에 적합하다.
저장 프로시저 생성 시 소유자 권한과 호출자 권한의 차이를 이해하고 저장 프로시저를 활용하면 보다 효율적으로 데이터베이스를 관리할 수 있다.
저장 프로시저 또는 저장 함수 생성 시 AUTHID 속성을 지정하여 소유자 권한 또는 호출자 권한 으로의 동작 여부를 지정할 수 있다. 정의문에 대한 자세한 내용은 저장 프로시저/함수 정의문를 참고한다.
AUTHID 속성을 다음과 같이 지정할 수 있으며, DEFINER와 OWNER 그리고 CURRENT_USER와 CALLER는 동의어이다.
소유자 권한: AUTHID DEFINER 또는 AUTHID OWNER
호출자 권한: AUTHID CURRENT_USER 또는 AUTHID CALLER
속성을 지정하지 않으면 기본적으로 소유자 권한으로 동작한다.
다음은 DBA 사용자로 로그인하여 CURRENT_USER, USER 를 반환하는 DBA 소유자 권한의 저장 함수를 만들고 U1 사용자에서 호출하는 예이다.
-- DBA로 로그인
CREATE USER U1;
CREATE OR REPLACE FUNCTION fn_current_user() RETURN STRING AUTHID DEFINER AS
BEGIN
RETURN CURRENT_USER;
END;
GRANT EXECUTE ON PROCEDURE fn_current_user TO U1;
CALL login ('U1', '') ON CLASS db_user;
SELECT dba.fn_current_user();
-- 위와 같이 U1 사용자로 호출했지만, 결과는 'DBA@' 이므로 소유자 권한으로 실행되었음을 알 수 있다.
dba.fn_current_user()
======================
'DBA@<host>'
Warning
CUBRID의 PL/CSQL에서는 현재 소유자 권한 만을 지원하고 있으며, 호출자 권한은 지원하지 않는다.
호출자 권한을 사용하기 위해서는 Java SP를 사용하여 저장 프로시저를 작성해야 한다.
Note
소유자 권한은 CUBRID 11.4 버전부터 지원한다.