PostgreSQL을 사용하는 중에, 테이블에 대한 접근 권한을 부여하는 과정에서 예상치 못한 문제가 발생해서 기록해둔다.
알다시피 PostgreSQL에서 테이블에 접근하기 위해서는
1. DB에 대한 접근
2. 스키마에 대한 접근
3. 테이블(오브젝트)에 대한 접근
권한이 모두 있어야 한다.
그중 DB와 스키마에 대한 접근은
GRANT CONNECT ON DATABASE [디비명] TO [사용자명];
GRANT USAGE ON SCHEMA [스키마명] TO [사용자명];
이런 구문으로 비교적 쉽게 부여할 수 있다.
문제는 오브젝트에 대한 접근이다.
만약 어떤 스키마내의 모든 테이블에 권한을 부여하고 싶다면
널리 알려진 아래의 예시처럼 구문을 사용하면 된다.
GRANT ALL ON ALL TABLES IN SCHEMA 스키마A TO 사용자A;
자, 그러면 저 구문을 사용하고 나서 스키마A에 사용자A가 아닌 다른 사용자가 테이블을 생성하면
사용자A는 그 테이블에 접근할 수 있을까? 불가능하다. 위 구문은 이미 만들어져 있는 테이블에 대한 적용이기 때문이다.
아래의 상황은 딱 이 문제를 겪기 좋은 상황이다.
이 문제의 해결은 바로 스키마내 테이블(오브젝트)에 대한 기본 권한 정책을 바꿔주는 것이다.
ALTER DEFAULT PRIVILEGES
FOR USER 관리용 사용자 IN SCHEMA 스키마명
GRANT ALL ON TABLES TO 서비스 사용자;
위의 구문을 사용하면 스키마내에서 관리용 사용자가 만든 테이블에 대해 기본 권한이 '서비스 사용자에게 모든 권한 부여'로 바뀌기 때문에, 미래에 만들어 지는 테이블에 대해서도 문제없이 서비스 사용자의 접근이 가능하다. 꼭 테이블이 아닌 시퀀스 등에 대해서도 사용가능하다.