PostgreSQL 에는 사용자와 그룹이 따로 없고 롤 하나로 통일되어 있다. 로그인할 수 있는 롤이 곧 사용자다.
CREATE ROLE appuser LOGIN PASSWORD '${PASSWORD}';
ALTER ROLE appuser PASSWORD '${PASSWORD}';
CREATE USER 는 CREATE ROLE ... LOGIN 의 별칭이다. 비밀번호 만료일을 두려면 VALID UNTIL 을 쓴다. 이것은 비밀번호의 유효기간이지 계정 잠금이 아니다.
ALTER ROLE appuser VALID UNTIL '2027-12-31';
로그인을 막으려면 NOLOGIN 으로 바꾼다.
ALTER ROLE appuser NOLOGIN;
password_encryption 이 저장 해시를 정한다. PostgreSQL 14 부터 기본값이 scram-sha-256 이다. md5 는 오래전부터 권장되지 않으며 최근 버전은 사용 중단 경고를 낸다.
SHOW password_encryption;
SELECT rolname, LEFT(rolpassword, 14) AS method FROM pg_authid WHERE rolcanlogin;
postgresql.conf 에서 password_encryption = scram-sha-256 으로 바꿔도 이미 저장된 해시는 그대로다. 방식을 바꾼 뒤 각 롤의 비밀번호를 다시 설정해야 SCRAM 해시로 저장된다.
ALTER ROLE appuser PASSWORD '${PASSWORD}';
오래된 JDBC·psycopg 드라이버는 SCRAM 을 지원하지 않는다. 클라이언트를 먼저 올린 뒤 서버 쪽을 바꾼다.
비밀번호는 pg_hba.conf 가 그 접속을 어떤 방식으로 인증할지 정한 뒤에야 쓰인다. 파일은 위에서부터 읽어 첫 번째로 일치하는 줄을 적용하고 거기서 멈춘다. 뒤에 더 넓은 규칙이 있어도 소용없다.
# TYPE DATABASE USER ADDRESS METHOD
local all all peer
host all all 127.0.0.1/32 scram-sha-256
host appdb appuser 10.0.0.0/16 scram-sha-256
psql: 치명적오류: 사용자 "appuser"의 peer 인증을 실패했습니다 는 유닉스 소켓으로 접속했고 그 줄의 방식이 peer 라는 뜻이다. peer 는 OS 로그인 계정 이름과 DB 롤 이름이 같아야 통과한다. 비밀번호를 쓰려면 TCP 로 붙거나 local 줄의 방식을 scram-sha-256 으로 바꾼다.
psql -h 127.0.0.1 -U appuser -d appdb
-h localhost 를 주면 소켓이 아니라 TCP 로 붙으므로 host 줄이 적용된다.
pg_hba.conf 와 pg_ident.conf 는 재시작 없이 다시 읽힌다.
systemctl reload postgresql-17
SELECT pg_reload_conf();
SELECT * FROM pg_hba_file_rules; -- 문법 오류가 있으면 여기서 보인다
postgresql.conf 의 항목은 재시작이 필요한 것과 reload 로 되는 것이 섞여 있다. pg_settings.context 로 구분한다.
SELECT name, setting, context FROM pg_settings WHERE name IN ('listen_addresses','password_encryption');
\du
SELECT rolname, rolcanlogin, rolsuper, rolvaliduntil FROM pg_roles ORDER BY rolname;