권한 관리의 편의상 사용자를 그룹으로 묶는 것이 편리할 수 있다. 이렇게 하면 권한을 그룹 단위로 부여하거나 취소할 수 있다. PostgreSQL에서 이것은 그룹을 나타내는 role을 생성한 다음, 그룹 role의 멤버십을 개별 사용자 role에 부여하면 된다.
그룹 role을 설정하려면 먼저 role을 생성해야 한다.
CREATE ROLE name
;
일반적으로 그룹으로 사용되는 role은 LOGIN
속성이 없으며, 원하면 설정은 할 수 있다.
그룹 role이 존재하는 경우 GRANT 및 REVOKE 명령을 사용하여 멤버를 추가 및 삭제할 수 있다.
GRANTgroup_role
TOrole1
, ... ; REVOKEgroup_role
FROMrole1
, ... ;
다른 그룹 role에도 멤버십을 부여할 수 있다(그룹 role과 비 그룹 role 사이에 실제로는 구분이 없음).
데이터베이스는 순환식 멤버십 루프의 설정을 허용하지 않는다. 또한, role의 멤버십을 PUBLIC
에 부여하는 것도 허용하지 않는다.
그룹 role의 멤버는 두 가지 방법으로 role의 권한을 사용할 수 있다. 첫째, 그룹의 모든 멤버는 명시적으로 SET ROLE을 수행하여 일시적으로 그룹 role이 “된다”.
이 상태에서 데이터베이스 세션은 원래의 로그인 role이 아닌 그룹 role에 대한 액세스 권한을 가지며, 생성된 데이터베이스 개체는 로그인 role이 아닌 그룹 role이 소유하는 것으로 간주된다.
둘째, INHERIT
속성이 있는 멤버 role은 해당 role에서 상속된 모든 권한을 비롯하여 멤버로서 role의 권한을 자동으로 갖는다. 예를 들면, 다음을 실행했다고 가정하자.
CREATE ROLE joe LOGIN INHERIT; CREATE ROLE admin NOINHERIT; CREATE ROLE wheel NOINHERIT; GRANT admin TO joe; GRANT wheel TO admin;
joe
role로 연결한 직후에 데이터베이스 세션은 joe
에 직접 부여된 권한 외에도, joe
는 admin
의 권한을 “상속 받기” 때문에 admin
에 부여된 권한도 사용한다.
그러나, joe
가 간접적으로 wheel
의 멤버지만 이 멤버십은 NOINHERIT
속성을 갖는 admin
을 통한 것이므로 wheel에 부여된 권한은 사용할 수 없다. 다음 명령을 실행한 후,
SET ROLE admin;
세션은 admin
에 부여된 이러한 권한만 사용하고 joe
에 부여된 권한은 사용하지 않는다. 다음 명령을 실행한 후,
SET ROLE wheel;
세션은 wheel
에 부여된 이러한 권한만 사용하고 joe
또는 admin
에 부여된 권한은 사용하지 않는다.
원래의 권한 상태는 다음 중 하나를 사용하면 복원된다.
SET ROLE joe; SET ROLE NONE; RESET ROLE;
SET ROLE
명령은 원래 로그인 role이 직간접적으로 멤버인 모든 role을 선택할 수 있도록 항상 허용한다.
따라서 위의 예시에서, wheel
이 되기 전에 꼭 admin
이어야 할 필요는 없다.
SQL 표준에서 사용자와 role은 명확히 구분되며, role은 권한을 자동으로 상속 받지만, 사용자는 그렇지 않다.
이는 SQL 사용자로서 사용되는 role에게는 NOINHERIT 속성을 부여하고, SQL role로 사용되는 role에게는 INHERIT
속성을 부여한다.
그러나, 사용자에게 항상 멤버인 그룹에 부여된 권한이 있는 8.1 릴리스 이전 버전과의 호환성 때문에 PostgreSQL은 기본적으로 모든 role에 INHERIT
속성을 부여한다.
role 속성 LOGIN
및 SUPERUSER
,
CREATEDB
, CREATEROLE
은 특수한 권한으로 생각될 수 있지만 데이터베이스 개체의 일상적인 권한으로 상속되지 않는다.
속성을 사용하려면 이러한 속성 중 하나를 보유한 특정 role에 실제로 SET ROLE
을 해야 한다. 위의 예시에 이어서, CREATEDB
및 CREATEROLE
을 admin
role에 부여할 수도 있다.
그러면, joe
role로 연결하는 세션은 이러한 권한을 즉각 갖지는 못하며, SET ROLE admin
을 수행한 이후에만 권한이 부여된다.
그룹 role을 소멸하려면 DROP ROLE을 사용해야 한다.
DROP ROLE name
;
그룹 role의 멤버십이 자동 취소된다(단, 멤버 role은 영향을 받지 않음).