PostgreSQL 모든 테이블에 대한 권한 부여 문제

easbui·2023년 9월 21일
0

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는 그 테이블에 접근할 수 있을까? 불가능하다. 위 구문은 이미 만들어져 있는 테이블에 대한 적용이기 때문이다.

아래의 상황은 딱 이 문제를 겪기 좋은 상황이다.

  1. DB 관리용 사용자와 서비스용 사용자를 구분해 만든다.
  2. 서비스용 사용자에 GRANT ALL ... 을 이용해 스키마 내 모든 테이블에 권한 부여.
  3. 관리용 사용자가 테이블 등을 생성하다.
  4. 서비스에선 새로 만든 테이블에 접근할 수 없다 ㅠㅠ

이 문제의 해결은 바로 스키마내 테이블(오브젝트)에 대한 기본 권한 정책을 바꿔주는 것이다.

ALTER DEFAULT PRIVILEGES 
	FOR USER 관리용 사용자 IN SCHEMA 스키마명 
    GRANT ALL ON TABLES TO 서비스 사용자;

위의 구문을 사용하면 스키마내에서 관리용 사용자가 만든 테이블에 대해 기본 권한이 '서비스 사용자에게 모든 권한 부여'로 바뀌기 때문에, 미래에 만들어 지는 테이블에 대해서도 문제없이 서비스 사용자의 접근이 가능하다. 꼭 테이블이 아닌 시퀀스 등에 대해서도 사용가능하다.

profile
개발자 - 프로그램을 개발새발짜는 사람

0개의 댓글