저장 프로시저의 권한

이 장에서는 저장 프로시저를 호출하기 위해 필요한 권한과 다른 사용자에게 프로시저에 대한 호출 권한을 부여하는 방법에 대하여 자세히 설명한다. 또한 호출 시 어떤 사용자의 권한으로 호출하는지 명시하는 소유자 권한과 호출자 권한의 차이에 대하여 자세히 설명한다.

프로시저 호출 권한 부여

프로시저를 생성하면 프로시저를 생성한 사용자의 스키마에 속하며, 오직 소유자DBA 권한을 가진 사용자만이 프로시저를 호출할 수 있다. 프로시저의 소유자가 다른 사용자에게 프로시저에 대한 호출 권한을 부여하면, 해당 사용자는 권한을 부여받은 다른 사용자의 프로시저를 호출할 수 있다.

이 때 주의해야할 점은 구현하는 일련의 루틴에서 권한이 없는 객체를 참조하는 경우에는 컴파일 또는 실행 시 오류가 발생할 수 있다. 따라서 저장 프로시저에서 참조하는 객체에 대해서도 권한이 있는지 확인하는 것이 필요하다.

CUBRID에서는 GRANT 문을 사용하여 프로시저에 대한 호출 권한을 부여할 수 있다.

GRANT EXECUTE ON PROCEDURE procedure_name TO user_name;

반대로 REVOKE 문을 사용하여 프로시저에 대한 호출 권한을 해지할 수 있다.

REVOKE EXECUTE ON PROCEDURE procedure_name FROM user_name;

Note

저장 프로시저와 저장 함수에 대한 EXECUTE ON PROCEDURE 권한은 WITH GRANT OPTION 을 지원하지 않는다. 따라서 프로시저의 소유자가 부여한 권한을 다른 사용자에게 부여할 수 없다.

소유자 권한과 호출자 권한의 차이

프로시저의 호출 권한을 가지면, 해당 프로시저를 실행할 때 어떠한 사용자의 권한으로 실행될지 명시할 수 있다. 저장 프로시저와 저장 함수는 소유자 권한 또는 호출자 권한으로 실행될 수 있다. 실행 권한은 저장 프로시저 또는 저장함수 생성시 둘 중 하나를 선택하여 생성할 수 있으며, 지정한 권한으로 실행된다.

다음은 각 권한에 대한 설명과 차이점을 설명한다.

  • 소유자 권한 (Owner’s Rights 또는 Definer’s Rights)
    • 저장 프로시저를 만든 사용자의 권한으로 실행된다.

    • 저장 프로시저를 만든 사용자가 다른 사용자에게 권한을 부여하면 부여된 사용자도 저장 프로시저를 실행할 수 있다.

    • 저장 프로시저의 소유자의 모든 권한을 사용 가능하므로 별도의 권한 부여 없이 소유자가 접근할 수 있는 데이터베이스 객체에 접근할 수 있다. DBA의 소유자 권한으로 저장 프로시저를 만들면 모든 데이터베이스 객체에 접근할 수 있으므로 특히 동적 SQL(Dynamic SQL)을 사용할 때 SQL 인젝션(SQL Injection)과 같은 보안 문제에 주의해야 한다.

    • 공통적인 작업이나 데이터 접근을 필요로 하는데 적합하다.

반면에 호출자 권한은 다음과 같다.

  • 호출자 권한 (Caller’s Rights 또는 Invoker’s Rights)
    • 저장 프로시저를 만든 사용자의 권한이 아닌 호출자의 권한으로 실행된다.

    • 호출자 권한으로 저장 프로시저를 만들고 다른 유저에게 권한을 부여하면, 저장 프로시저를 호출하는 사용자의 권한으로 실행된다.

    • 호출자 권한으로 저장 프로시저를 만들면 저장 프로시저를 만든 사용자의 권한이 아닌 호출자의 권한 수준에서 실행되므로 호출자의 권한으로 데이터베이스 객체에 접근할 수 있다. 따라서 호출자 권한으로 저장 프로시저를 만들 때는 호출자의 권한 수준을 고려하여 저장 프로시저를 만들어야 한다.

    • 호출자별로 권한을 다르게 적용해야할 경우에 적합하다.

저장 프로시저 생성 시 소유자 권한과 호출자 권한의 차이를 이해하고 저장 프로시저를 활용하면 보다 효율적으로 데이터베이스를 관리할 수 있다.

저장 프로시저 또는 저장 함수 생성 시 AUTHID 속성을 지정하여 소유자 권한 또는 호출자 권한 으로의 동작 여부를 지정할 수 있다. 정의문에 대한 자세한 내용은 저장 프로시저/함수 정의문를 참고한다.

AUTHID 속성을 다음과 같이 지정할 수 있으며, DEFINEROWNER 그리고 CURRENT_USERCALLER는 동의어이다.

  • 소유자 권한: 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 버전부터 지원한다.