PostgreSQL에서 롤(Role) 은 데이터베이스 접근 권한을 관리하는 개체입니다.
과거에는 사용자(User)와 그룹(Group)을 별도로 관리했지만, PostgreSQL은 이 둘을 롤 하나로 통합했습니다.
💡 핵심 개념: PostgreSQL에서는 모든 것이 롤입니다. 사용자도, 그룹도 모두 롤입니다.
LOGIN 속성 유무에 따라 역할이 나뉩니다.
| 종류 | LOGIN 속성 | 설명 |
|---|---|---|
| 로그인 롤 | O | DB 접속 가능, 사용자처럼 동작 |
| 그룹 롤 | X | 권한 묶음 역할, 그룹처럼 동작 |
-- 그룹 롤 생성 (로그인 불가)
CREATE ROLE developer;
-- 로그인 롤 생성 (로그인 가능)
CREATE ROLE alice WITH LOGIN PASSWORD 'password123';
-- CREATE USER = CREATE ROLE + LOGIN 축약 문법
CREATE USER bob WITH PASSWORD 'password456';
| 속성 | 설명 |
|---|---|
LOGIN | DB 접속 허용 |
SUPERUSER | 모든 권한 보유 (슈퍼유저) |
CREATEDB | 데이터베이스 생성 가능 |
CREATEROLE | 다른 롤 생성 가능 |
REPLICATION | 복제(Replication) 연결 허용 |
INHERIT | 부여받은 롤의 권한 자동 상속 (기본값) |
PASSWORD | 로그인 비밀번호 설정 |
CREATE ROLE admin WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD 'adminpass';
\du
List of roles
Role name | Attributes
-----------+------------------------------------------------------------
alice | Superuser, Create DB
bob |
developer | Cannot login ← 그룹 롤
admin | Create role, Create DB
Cannot login 이 표시되면 그룹 롤, 없으면 로그인 롤입니다.
SELECT
rolname AS 롤이름,
rolcanlogin AS 로그인가능,
rolsuper AS 슈퍼유저,
rolcreatedb AS DB생성,
rolcreaterole AS 롤생성,
rolinherit AS 권한상속
FROM pg_roles
WHERE rolname NOT LIKE 'pg_%'
ORDER BY rolcanlogin DESC;
rolcanlogin = t → 로그인 롤rolcanlogin = f → 그룹 롤-- 로그인 롤만 조회
SELECT rolname AS 로그인롤
FROM pg_roles
WHERE rolcanlogin = true
AND rolname NOT LIKE 'pg_%';
-- 그룹 롤만 조회
SELECT rolname AS 그룹롤
FROM pg_roles
WHERE rolcanlogin = false
AND rolname NOT LIKE 'pg_%';
GRANT 그룹롤 TO 로그인롤;
-- 1. 그룹 롤 생성 및 권한 부여
CREATE ROLE developer;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO developer;
-- 2. 로그인 롤 생성
CREATE ROLE alice WITH LOGIN PASSWORD 'password123';
CREATE ROLE bob WITH LOGIN PASSWORD 'password456';
-- 3. 그룹 롤을 로그인 롤에 부여
GRANT developer TO alice;
GRANT developer TO alice, bob; -- 여러 명에게 한번에 부여
-- ✅ INHERIT (기본값): 권한 자동 상속
CREATE ROLE alice WITH LOGIN INHERIT;
GRANT developer TO alice;
-- alice로 로그인하면 developer 권한이 자동으로 활성화
-- ⚠️ NOINHERIT: 수동으로 롤 전환 필요
CREATE ROLE alice WITH LOGIN NOINHERIT;
GRANT developer TO alice;
SET ROLE developer; -- 수동 전환
RESET ROLE; -- 원래 롤로 복귀
SELECT
r.rolname AS 그룹롤,
m.rolname AS 멤버롤
FROM pg_roles r
JOIN pg_auth_members am ON am.roleid = r.oid
JOIN pg_roles m ON m.oid = am.member;
그룹롤 | 멤버롤
-----------+--------
developer | alice
developer | bob
REVOKE developer FROM alice;
REVOKE developer FROM alice, bob; -- 여러 명에게서 한번에 회수
모든 로그인 롤이 GRANT를 실행할 수 있는 것은 아닙니다.
다음 세 가지 경우에만 그룹 롤을 다른 롤에게 부여할 수 있습니다.
CREATE ROLE admin WITH LOGIN SUPERUSER PASSWORD 'adminpass';
-- 모든 롤을 제한 없이 부여 가능
CREATE ROLE manager WITH LOGIN CREATEROLE PASSWORD 'managerpass';
-- 그룹 롤을 다른 롤에게 부여 가능
⚠️ PostgreSQL 16부터 변경사항
- 16 이전:
CREATEROLE이 있으면 모든 롤 부여 가능- 16 이후:
CREATEROLE이 있어도 본인이 속한 롤만 부여 가능 (보안 강화)
-- alice에게 developer 롤을 부여할 수 있는 권한까지 위임
GRANT developer TO alice WITH ADMIN OPTION;
-- 이제 alice도 developer 롤을 다른 사람에게 부여 가능
GRANT developer TO bob; -- ✅ 가능
GRANT developer TO carol; -- ✅ 가능
WITH ADMIN OPTION은 부여받은 그 롤 하나에 대해서만 다른 사람에게 줄 수 있는 권한입니다.
GRANT developer TO alice WITH ADMIN OPTION;
-- designer, devops는 ADMIN OPTION 없음
-- alice로 로그인 후...
GRANT developer TO bob; -- ✅ 가능 (admin option 있음)
GRANT designer TO bob; -- ❌ 불가 (admin option 없음)
GRANT devops TO bob; -- ❌ 불가 (admin option 없음)
여러 롤에 각각 부여하는 것도 가능합니다.
GRANT developer TO alice WITH ADMIN OPTION;
GRANT designer TO alice WITH ADMIN OPTION;
GRANT developer TO bob; -- ✅ 가능
GRANT designer TO bob; -- ✅ 가능
GRANT devops TO bob; -- ❌ 불가
SELECT
r.rolname AS 그룹롤,
m.rolname AS 멤버롤,
am.admin_option AS 어드민권한
FROM pg_auth_members am
JOIN pg_roles r ON r.oid = am.roleid
JOIN pg_roles m ON m.oid = am.member;
그룹롤 | 멤버롤 | 어드민권한
-----------+--------+-----------
developer | alice | t ← alice는 developer를 남에게 부여 가능
developer | bob | f ← bob은 부여 불가
| 구분 | 부여 범위 | 설정 방법 |
|---|---|---|
SUPERUSER | 모든 롤 제한 없음 | CREATE ROLE ... SUPERUSER |
CREATEROLE | 본인이 속한 롤 (PG16+) | CREATE ROLE ... CREATEROLE |
WITH ADMIN OPTION | 해당 특정 그룹 롤만 | GRANT 롤 TO 유저 WITH ADMIN OPTION |
💡 최소 권한 원칙: 가능하면
WITH ADMIN OPTION을 사용하는 것이 가장 안전합니다.
롤(Role)
├── 로그인 롤 (LOGIN O) : 실제 DB 접속 계정
└── 그룹 롤 (LOGIN X) : 권한 묶음
그룹 롤 부여 가능한 롤
├── SUPERUSER → 제한 없이 모든 롤 부여 가능
├── CREATEROLE → 본인이 속한 롤만 부여 가능 (PG16+)
└── WITH ADMIN OPTION → 해당 특정 그룹 롤만 부여 가능