[PostgreSQL] 10. 사용자 관리와 권한 (Role & Privilege)
PostgreSQL의 롤(Role) 기반 사용자 관리와 권한 설정을 정리합니다.
롤 (Role) 개념
PostgreSQL에서는 사용자(User)와 그룹(Group)을 구분하지 않고 모두 Role로 통합합니다.
LOGIN 속성이 있으면 사용자, 없으면 그룹 역할을 합니다.
롤 생성
-- 로그인 가능한 롤 (= 사용자)
CREATE ROLE devuser WITH LOGIN PASSWORD 'DevPass123!';
-- CREATE USER는 CREATE ROLE + LOGIN의 축약
CREATE USER devuser WITH PASSWORD 'DevPass123!';
-- 다양한 속성 지정
CREATE ROLE admin_user WITH
LOGIN
PASSWORD 'AdminPass123!'
SUPERUSER
CREATEDB
CREATEROLE
VALID UNTIL '2027-12-31';
-- 그룹 롤 (로그인 불가)
CREATE ROLE app_readonly;
CREATE ROLE app_readwrite;
롤 속성
| 속성 | 설명 |
|---|---|
| LOGIN / NOLOGIN | 로그인 가능 여부 |
| SUPERUSER / NOSUPERUSER | 슈퍼유저 여부 |
| CREATEDB / NOCREATEDB | DB 생성 권한 |
| CREATEROLE / NOCREATEROLE | 롤 생성 권한 |
| REPLICATION / NOREPLICATION | 복제 권한 |
| PASSWORD ‘xxx’ | 비밀번호 설정 |
| VALID UNTIL ‘timestamp’ | 계정 만료일 |
| CONNECTION LIMIT n | 최대 동시 접속 수 |
| INHERIT / NOINHERIT | 그룹 롤 권한 자동 상속 |
롤 조회 및 관리
-- 롤 목록
\du
SELECT rolname, rolsuper, rolcreatedb, rolcanlogin FROM pg_roles;
-- 비밀번호 변경
ALTER ROLE devuser WITH PASSWORD 'NewPass456!';
-- 속성 변경
ALTER ROLE devuser WITH CREATEDB;
ALTER ROLE devuser WITH CONNECTION LIMIT 5;
-- 롤 삭제
DROP ROLE devuser;
DROP ROLE IF EXISTS devuser;
그룹 롤 (권한 그룹)
-- 그룹 롤 생성 및 권한 부여
CREATE ROLE app_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO app_readonly;
CREATE ROLE app_readwrite;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_readwrite;
-- 사용자에게 그룹 롤 부여
GRANT app_readonly TO report_user;
GRANT app_readwrite TO devuser;
-- 그룹 롤 회수
REVOKE app_readwrite FROM devuser;
-- 멤버십 확인
SELECT r.rolname AS role, m.rolname AS member
FROM pg_auth_members am
JOIN pg_roles r ON r.oid = am.roleid
JOIN pg_roles m ON m.oid = am.member;
권한 관리 (GRANT / REVOKE)
데이터베이스 수준
GRANT CONNECT ON DATABASE mydb TO devuser;
GRANT CREATE ON DATABASE mydb TO devuser;
REVOKE ALL ON DATABASE mydb FROM devuser;
스키마 수준
GRANT USAGE ON SCHEMA app TO devuser;
GRANT CREATE ON SCHEMA app TO devuser;
GRANT ALL ON SCHEMA app TO devuser;
테이블 수준
-- 특정 테이블
GRANT SELECT ON employees TO devuser;
GRANT INSERT, UPDATE, DELETE ON employees TO devuser;
GRANT ALL ON employees TO devuser;
-- 특정 컬럼만
GRANT SELECT (name, dept_id), UPDATE (salary) ON employees TO devuser;
-- 스키마 내 모든 테이블
GRANT SELECT ON ALL TABLES IN SCHEMA public TO devuser;
-- 향후 생성될 테이블에도 자동 적용
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO app_readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_readwrite;
시퀀스 권한
GRANT USAGE ON SEQUENCE employees_id_seq TO devuser;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO devuser;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT USAGE ON SEQUENCES TO app_readwrite;
함수 권한
GRANT EXECUTE ON FUNCTION fn_salary_grade(NUMERIC) TO devuser;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO devuser;
권한 확인
-- 테이블 권한 확인
\dp employees
SELECT grantee, privilege_type
FROM information_schema.table_privileges
WHERE table_name = 'employees';
-- 현재 사용자 확인
SELECT current_user, session_user;
권한 회수
REVOKE INSERT ON employees FROM devuser;
REVOKE ALL ON employees FROM devuser;
REVOKE ALL ON ALL TABLES IN SCHEMA public FROM devuser;
pg_hba.conf (접속 인증 설정)
PostgreSQL의 접속 인증은 pg_hba.conf 파일에서 관리합니다.
# TYPE DATABASE USER ADDRESS METHOD
local all postgres peer
host all all 127.0.0.1/32 scram-sha-256
host all all 192.168.1.0/24 scram-sha-256
host mydb devuser 10.0.0.0/8 scram-sha-256
host all all 0.0.0.0/0 reject
| METHOD | 설명 |
|---|---|
| trust | 무조건 허용 (비권장) |
| peer | OS 사용자명과 DB 사용자명 일치 시 허용 (로컬) |
| scram-sha-256 | 비밀번호 인증 (권장) |
| md5 | MD5 비밀번호 인증 (레거시) |
| reject | 접속 거부 |
| cert | SSL 인증서 |
-- pg_hba.conf 위치 확인
SHOW hba_file;
-- 설정 변경 후 리로드
SELECT pg_reload_conf();
-- 또는
-- sudo systemctl reload postgresql
실무 사용자 구성 예시
| 용도 | 롤 | 권한 |
|---|---|---|
| 애플리케이션 | app_user | SELECT, INSERT, UPDATE, DELETE + USAGE ON SEQUENCES |
| 읽기 전용 | report_user | SELECT |
| 개발자 | dev_user | ALL ON 개발 DB |
| DBA | dba_user | SUPERUSER |
| 마이그레이션 | migration_user | ALL + CREATE |
-- 애플리케이션 사용자
CREATE USER app_user WITH PASSWORD 'AppSecure123!';
GRANT CONNECT ON DATABASE production_db TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public TO app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT USAGE ON SEQUENCES TO app_user;
- [PostgreSQL] 13. 자주 발생하는 Troubleshooting
- [PostgreSQL] 12. 성능 튜닝 (Performance Tuning)
- [PostgreSQL] 11. 백업과 복구 (Backup & Recovery)
- [PostgreSQL] 10. 사용자 관리와 권한 (Role & Privilege)
- [PostgreSQL] 09. PL/pgSQL, 뷰, 함수, 트리거
- [PostgreSQL] 08. 트랜잭션과 락 (Transaction & Lock)
- [PostgreSQL] 07. 인덱스 (Index)
- [PostgreSQL] 06. 내장 함수 정리
- [PostgreSQL] 05. 서브쿼리와 고급 SELECT
- [PostgreSQL] 04. JOIN (테이블 결합)
- [PostgreSQL] 03. CRUD 기본 (INSERT, SELECT, UPDATE, DELETE)
- [PostgreSQL] 02. 데이터베이스와 테이블 관리
- [PostgreSQL] 01. PostgreSQL 소개 및 설치