PostgreSQL | 역할(사용자) ROLE 생성 | 역할 생성(CREATE ROLE)


CREATE ROLE 명령을 사용하여 PostgreSQL에서 역할을 새로 만드는 방법에 대해 설명한다.

새 역할 만들기

새 역할을 만들려면 CREATE ROLE 명령을 사용한다. 형식은 다음과 같다.

CREATE ROLE name [ [ WITH ] option [ ... ] ]

option:
      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

옵션이 많지만, 역할을 사용하여 사용자 인증을 위한 목적이라면기본 형식은 다음과 같다.

CREATE ROLE name [ WITH ] LOGIN PASSWORD 'password'

역할 이름(name)을 지정하고 클라이언트에서 PostgreSQL에 연결할 때 사용자 인증의 대상으로 사용 가능한 역할을 암호 인증 할 때 사용하는 비밀번호를 ('password')으로 만든다.

역할을 만들려면 명령을 수행하는 역할이 수퍼 유저 또는 CREATEROLE 권한을 가지고 있어야 한다.

그러면 실제로 해보도록 하자. psql에서 다음과 같이 실행한다.

postgres=# create role kuma with login password 'bear';
CREATE ROLE
postgres=#

이름이 kuma 이고, 인증 비밀번호가 bear의 새로운 역할이 생성되었다.

그러면 생성된 역할을 조회해 보자.

postgres=# \du
                                롤 목록
 롤 이름  |                      속성                      | 소속 그룹:
----------+------------------------------------------------+------------
 kimkc    | 슈퍼유저                                       | {}
 kuma     |                                                | {}
 orange   |                                                | {}
 postgres | 슈퍼유저, 롤 만들기, DB 만들기, 복제, RLS 통과 | {}


postgres=#

PostgreSQL 설치시 자동으로 생성된 postgres 이외에 방금 만든 kuma가 추가되어 있는 것을 확인할 수 있다.

생성한 역할에 PostgreSQL에 연결하기

방금 만든 역할에서 PostgreSQL에 연결를 해보자. 명령 프롬프트에서 다음과 같이 실행한다.

psql -U kuma -d devkuma

psql을 사용하는 경우 연결하는 데이터베이스를 생략하면 역할 이름과 동일한 데이터베이스에 연결하기 때문에, kuma라는 데이터베이스를 만들지 않기도 해서 여기에서는 생성된 데이터베이스 이름을 명시적으로 지정하였다.

다음과 같이 kuma 암호 입력 대기하므로 롤 만들 때 지정한 암호를 입력한다.

C:\Users\kimkc>psql -U kuma -d devkuma
kuma 사용자의 암호:
psql (12.2)
도움말을 보려면 "help"를 입력하십시오.

devkuma=>

saru 역할 PostgreSQL에 연결할 수있었습니다.

CREATE ROLE 명령 권한 옵션

CREATE ROLE 명령에서 지정 가능한 옵션에서 권한과 관련된 옵션에 대해 설명한다. 기타 옵션에 대해서는 필요할 때마다 설명하겠다.

SUPERUSER or NOSUPERUSER

SUPERUSER를 지정하게 되면 작성하는 역할은 수퍼 유저가 된다. 수퍼 유저는 대부분의 권한을 가지게 되므로 만들 때주의가 필요하다. 최초에 PostgreSQL 설치할 때 자동으로 생성되는 postgres 역할은 슈퍼 유저이다. NOSUPERUSER을 지정하게 되면 수퍼 유저가 아닌 역할이 만들어진다.

SUPERUSER를 지정하려면 다음과 같다. 이 옵션을 지정하지 않으면 기본적으로 NOSUPERUSER가 지정된 것으로 간주된다.

CREATE ROLE name WITH SUPERUSER

CREATEDB or NOCREATEDB

CREATEDB를 지정하게 되면 역할은 데이터베이스를 만들 수있는 권한을 가진다. NOCREATEDB을 지정한 경우 데이터베이스를 만들 수 없다.

CREATEDB를 지정하려면 다음과 같다. 이 옵션을 지정하지 않으면 기본적으로 NOCREATEDB가 지정된 것으로 간주된다.

CREATE ROLE name WITH CREATEDB

CREATEROLE or NOCREATEROLE

CREATEROLE을 지정하게 되면 역할을 만들 권한을 갖는다. NOCREATEROLE를 지정하면 롤을 만들 수 없다.

※ CREATEROLE 권한을 부여할 경우 주의가 필요하다. CREATEROLE 권한이 있는 역할은 자신이 가지고 있지 않은 권한을 가진 같은 역할을 새로 만들 수 있다. 따라서 CREATEROLE를 지정하게 되면 결과적으로 거의 모든 권한을 주는 것과 같은 의미를 가진다.

CREATEROLE을 지정하려면 다음과 같다. 이 옵션을 지정하지 않으면 기본적으로 NOCREATEROLE가 지정된 것으로 간주된다.

CREATE ROLE name WITH CREATEROLE

그러면 실제로 해보도록 하자. CREATEDB 및 CREATEROLE을 지정된 새 역할 superkuma 을 만들려고 한다.

devkuma=# create role superkuma with createdb createrole login password 'bear';
CREATE ROLE
devkuma=#

이름이 superkuma의 새로운 역할이 만들어 졌다.

그러면 생성 된 역할을 조회해 본다.

devkuma=# \du
                                 롤 목록
  롤 이름  |                      속성                      | 소속 그룹:
-----------+------------------------------------------------+------------
 kimkc     | 슈퍼유저                                       | {}
 kuma      |                                                | {}
 orange    |                                                | {}
 postgres  | 슈퍼유저, 롤 만들기, DB 만들기, 복제, RLS 통과 | {}
 superkuma | 롤 만들기, DB 만들기                           | {}


devkuma=#

새로 만든 역할의 속성 부분을 보면 “롤 만들기, DB 만들기"라고 표시되어 있으며, CREATE ROLE 명령을 실행했을 때 지정한 CREATEDB 및 CREATEROLE 설정이 반영되는 것을 확인할 수 있다.

여기까지 CREATE ROLE 명령을 사용하여 새 역할을 만드는 방법에 대해 알아보았다.