PostgreSQL 롤(Role)

이민재·2026년 4월 6일

PostgreSQL 롤(Role) 정리

롤(Role)이란?

PostgreSQL에서 롤(Role) 은 데이터베이스 접근 권한을 관리하는 개체입니다.
과거에는 사용자(User)와 그룹(Group)을 별도로 관리했지만, PostgreSQL은 이 둘을 롤 하나로 통합했습니다.

💡 핵심 개념: PostgreSQL에서는 모든 것이 롤입니다. 사용자도, 그룹도 모두 롤입니다.


롤의 두 가지 종류

LOGIN 속성 유무에 따라 역할이 나뉩니다.

종류LOGIN 속성설명
로그인 롤ODB 접속 가능, 사용자처럼 동작
그룹 롤X권한 묶음 역할, 그룹처럼 동작
-- 그룹 롤 생성 (로그인 불가)
CREATE ROLE developer;

-- 로그인 롤 생성 (로그인 가능)
CREATE ROLE alice WITH LOGIN PASSWORD 'password123';

-- CREATE USER = CREATE ROLE + LOGIN 축약 문법
CREATE USER bob WITH PASSWORD 'password456';

주요 속성(Attribute)

속성설명
LOGINDB 접속 허용
SUPERUSER모든 권한 보유 (슈퍼유저)
CREATEDB데이터베이스 생성 가능
CREATEROLE다른 롤 생성 가능
REPLICATION복제(Replication) 연결 허용
INHERIT부여받은 롤의 권한 자동 상속 (기본값)
PASSWORD로그인 비밀번호 설정
CREATE ROLE admin WITH LOGIN SUPERUSER CREATEDB CREATEROLE PASSWORD 'adminpass';

롤 확인 방법

psql 메타 명령

\du
                                   List of roles
 Role name |                         Attributes
-----------+------------------------------------------------------------
 alice     | Superuser, Create DB
 bob       |
 developer | Cannot login        ← 그룹 롤
 admin     | Create role, Create DB

Cannot login 이 표시되면 그룹 롤, 없으면 로그인 롤입니다.

pg_roles 뷰로 쿼리

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 여부에 따른 동작 차이

-- ✅ 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를 실행할 수 있는 것은 아닙니다.
다음 세 가지 경우에만 그룹 롤을 다른 롤에게 부여할 수 있습니다.

1. SUPERUSER

CREATE ROLE admin WITH LOGIN SUPERUSER PASSWORD 'adminpass';
-- 모든 롤을 제한 없이 부여 가능

2. CREATEROLE

CREATE ROLE manager WITH LOGIN CREATEROLE PASSWORD 'managerpass';
-- 그룹 롤을 다른 롤에게 부여 가능

⚠️ PostgreSQL 16부터 변경사항

  • 16 이전: CREATEROLE이 있으면 모든 롤 부여 가능
  • 16 이후: CREATEROLE이 있어도 본인이 속한 롤만 부여 가능 (보안 강화)

3. WITH ADMIN OPTION

-- alice에게 developer 롤을 부여할 수 있는 권한까지 위임
GRANT developer TO alice WITH ADMIN OPTION;

-- 이제 alice도 developer 롤을 다른 사람에게 부여 가능
GRANT developer TO bob;    -- ✅ 가능
GRANT developer TO carol;  -- ✅ 가능

WITH ADMIN OPTION의 핵심: "해당 롤 하나에만" 적용

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;   -- ❌ 불가

ADMIN OPTION 확인

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  → 해당 특정 그룹 롤만 부여 가능
profile
초보 개발자

0개의 댓글