블로그로 돌아가기

PostgreSQL에서 역할을 사용하고 권한을 관리하는 방법

PostgreSQL에서 역할을 사용하고 권한을 관리하는 방법

PostgreSQL은 SQL을 사용하는 오픈 소스 DBMS입니다. 이는 VPS에서 애플리케이션을 관리하고 웹 데이터를 호스팅하는 데 사용되는 매우 강력한 도구입니다. 이 튜토리얼에서는 PostgreSQL에서 권한을 관리하는 방법을 배웁니다. 이를 통해 애플리케이션 역할에 필요한 권한을 제공할 수 있습니다. 이 튜토리얼은 Ubuntu 18.04 클라우드 서버 (CloudSigma)에서 진행됩니다.

PostgreSQL 설치하기

PostgreSQL을 다운로드하고 설치하려면 다음 명령어를 실행하세요:

설치 프로그램은 작업을 수행할 기본 사용자인 – “Postgres”를 생성합니다. 이 튜토리얼의 대부분에서 이 사용자를 사용할 것입니다. 다음 명령어로 이 사용자에 로그인할 수 있습니다:

이제 PostgreSQL이 설치되었으므로, 권한을 처리하는 방법을 배우게 됩니다. 또한 다음의 Ubuntu에 PostgreSQL을 설정하는 방법에 대한 튜토리얼을 참고하여 설치 과정에 대한 자세한 단계별 가이드를 확인할 수 있습니다.

PostgreSQL 권한 개념

Postgres는 “역할”이라는 개념을 통해 권한을 관리합니다. 역할을 사용하면 사용자와 그룹 간의 구분이 없습니다. 역할은 기존 Unix 시스템의 사용자와 그룹보다 더 유연합니다. 예를 들어, 한 역할이 다른 역할의 구성원으로 작동하여 그 권한을 상속받을 수 있습니다.

PostgreSQL에서 역할 보기

PostgreSQL에서 역할을 보려면 먼저 다음 명령어를 사용하여 프롬프트에 로그인해야 합니다:

그런 다음, 역할을 보려면 다음을 실행하세요:

show roles manage permissions in PostgreSQL

현재로서는 모든 권한을 가진 하나의 기본 역할만 존재합니다.

PostgreSQL에서 역할을 생성하는 방법

명령줄이나 Postgres 셸 내부에서 Postgres용 역할을 생성할 수 있습니다. 다음 두 가지 방법을 시도해 볼 수 있으며, 그 후에 PostgreSQL에서 권한 및 액세스를 관리하는 방법을 알아보겠습니다.

PostgreSQL 내부에서 역할을 생성하는 방법

역할을 생성하는 가장 쉬운 방법은 Postgres 프롬프트 내부에서 생성하는 것입니다. 다음 명령어로 생성할 수 있습니다:

생성되었는지 확인하려면 다음 명령어를 실행하세요:

create role from prompt

새로운 역할에 로그인 권한이 없음을 명시합니다. 이 튜토리얼의 뒷부분에서 이를 변경하는 방법을 배우게 됩니다.

명령줄에서 역할을 생성하는 방법

위 방법의 대안은 명령줄에서 사용자를 생성하는 것입니다. PostgreSQL 프롬프트를 종료하려면 다음을 입력하세요:

다음 명령어로 “test”라는 역할을 생성할 수 있습니다:

위 명령어를 실행한 후, psql에 로그인하고 다음 명령어를 사용하여 역할 목록을 표시합니다:

creating user from commandline

이런 방식으로 생성된 사용자는 동일한 속성을 갖지 않는다는 것을 관찰할 수 있습니다.

PostgreSQL에서 역할을 삭제하는 방법

다음 구문을 사용하여 PostgreSQL에서 역할을 쉽게 삭제할 수 있습니다:

다음 명령어를 사용하여 이전에 생성한 데모 역할을 삭제할 수 있습니다:

drop role

존재하지 않는 역할을 삭제하려고 하면 오류가 발생합니다. 이를 확인하려면 동일한 역할을 다시 삭제해 보세요:

drop role fail

역할이 존재하지 않을 때 명령어가 오류를 발생시키지 않도록 하려면 명령어에 ‘IF EXISTS’를 추가할 수 있습니다:

이 명령어로 역할 삭제를 다시 시도할 수 있습니다:

drop role if exists

역할 생성 시 권한을 정의하는 방법

지금까지 역할을 생성하고 삭제해 보았습니다. 이 섹션에서는 변경된 권한을 가진 역할을 생성해 보겠습니다. 생성 명령어와 함께 역할의 권한을 지정하여 이를 수행할 수 있습니다:

이에 대한 옵션을 보려면 다음 명령어를 사용하여 도움말을 열 수 있습니다:

help create user

로그인 권한이 있는 역할을 생성하려면 다음과 같이 명령어를 구성할 수 있습니다:

create role with login manage permissions in PostgreSQL

앞서 살펴보았듯이, 로그인 권한이 있는 역할을 생성하려면 다음 명령어를 사용할 수도 있습니다:

두 명령어의 유일한 차이점은 ‘CREATE USER’는 기본적으로 역할에 로그인 권한을 부여한다는 것입니다.

PostgreSQL에서 역할의 권한을 변경하는 방법

지금까지는 사용자를 생성하면서 권한을 부여하는 방법을 알아보았습니다. 이 섹션에서는 이미 생성된 사용자의 권한을 변경합니다. alter 명령어의 구문은 다음과 같습니다:

예를 들어, 원하는 경우 이 명령어를 사용하여 demo_role의 로그인 권한을 ‘로그인’으로 변경할 수 있습니다:

alter nologin

사용자가 다시 로그인할 수 있도록 허용하려면 다음 명령어로 권한을 변경할 수 있습니다:

PostgreSQL에서 다른 사용자로 로그인하는 방법

PostgreSQL은 기본적으로 사용자 이름이 시스템 사용자 이름과 일치하는 경우에만 로컬로 로그인할 수 있도록 허용합니다. 이 문제를 해결하려면 로그인 유형을 변경하거나 루프백 네트워크 인터페이스를 사용하도록 PostgreSQL을 구성할 수 있습니다. 이 인터페이스는 연결이 로컬이더라도 연결 유형을 원격으로 변경합니다.

이 섹션에서는 두 번째 방법을 시도해 보겠습니다. 우선 인증이 가능하도록 사용자의 비밀번호를 설정할 수 있습니다.

다음 명령어로 ‘demo_user’의 비밀번호를 설정합니다:

메시지가 표시되면 비밀번호를 입력하고 확인합니다. 완료되면 PostgreSQL 인터페이스를 종료하고 일반 시스템 사용자로 돌아갈 수 있습니다:

PostgreSQL은 운영 체제의 사용자 이름과 일치하는 사용자 이름으로 로그인하고, 동일한 사용자 이름으로 데이터베이스에 연결할 것을 요구합니다. 이 경우에는 그렇게 하지 않으므로 사용할 옵션을 명시적으로 지정해야 합니다. 다음 구문을 사용할 수 있습니다:

user: 연결하려는 사용자 이름
DB: 액세스 권한이 있는 기존 데이터베이스
-h 127.0.0.1: 네트워크 인터페이스를 통해 로컬 머신에 연결할 것임을 PostgreSQL에 지정합니다. 이 옵션을 사용하면 사용자 이름이 시스템 사용자 이름과 일치하지 않더라도 인증할 수 있습니다.
-W: 비밀번호를 입력할 것임을 PostgreSQL에 나타냅니다

우리의 “test_user”로 로그인하려면 다음 명령어를 실행할 수 있습니다:

postgresql login through network interface manage permissions in PostgreSQL

비밀번호를 입력하면 셸에 로그인됩니다. 이 예제에서는 설치 중에 자동으로 설정되는 기본 데이터베이스인 ‘postgres’ 데이터베이스를 사용합니다.

이 세션에서는 로그인하기 위해 선택한 사용자에 따라 다양한 작업을 수행할 수 있는 적절한 권한이 없다는 문제에 직면하게 됩니다. 이 문제가 발생하는 이유는 사용자에게 관리 작업을 수행할 수 있는 충분한 권한을 아직 부여하지 않았기 때문입니다.

다음 섹션에서는 사용자에게 필요한 권한을 부여합니다. 먼저 사용자를 다시 관리자 사용자로 변경해야 합니다:

PostgreSQL에서 권한 관리: PostgreSQL에서 권한을 부여하는 방법

PostgreSQL에서는 특정 역할에 의해 데이터베이스나 테이블이 생성된 경우, 해당 역할만 이를 수정할 수 있는 권한을 가집니다. 단, 수퍼유저(superuser) 권한을 가진 역할은 예외입니다. 이 섹션에서는 다른 역할에 권한을 부여합니다. ‘GRANT’ 문을 사용하여 다른 역할에 권한을 부여할 수 있습니다. 구문은 다음과 같습니다:

명령을 수행하기 위해 간단한 테이블을 생성할 수 있습니다:

생성된 테이블을 보려면 다음 명령을 실행하세요:

create table manage permissions in PostgreSQL

이제 demo 테이블이 생성되었으므로 ‘demo’ 테이블에 대한 권한을 ‘demo_role’에 부여할 수 있습니다. 다음 명령을 사용하여 해당 역할에 ‘UPDATE’ 권한을 부여할 수 있습니다:

권한을 ‘ALL’로 지정하여 역할에 모든 권한을 부여할 수 있습니다:

시스템의 모든 역할에 특정 권한을 부여하려면 다음 명령과 같이 역할 대신 ‘public’ 키워드를 사용할 수 있습니다:

다음 명령을 사용하여 부여된 모든 권한을 볼 수 있습니다:

granted permissions

PostgreSQL에서 권한 관리하기: PostgreSQL에서 권한을 제거하는 방법

‘REVOKE’ 명령을 사용하여 역할의 권한을 쉽게 제거할 수 있습니다. 이는 grant 명령과 매우 유사합니다:

GRANT와 마찬가지로 – ‘ALL’ 및 ‘PUBLIC’ 키워드를 사용하여 모든 권한을 부여하거나 모든 역할에 권한을 부여할 수 있습니다:

PostgreSQL에서 그룹 역할을 사용하는 방법

광범위한 권한 제어를 활성화하기 위해, 역할은 다른 역할과 그룹화할 수 있을 만큼 유연합니다. 예를 들어, ‘temporary_role’ 역할을 생성한 다음 해당 역할에 ‘demo_role’ 및 ‘test_user’를 추가할 수 있습니다:

이제 ‘temporary_role’ 역할의 권한을 관리하는 것만으로 이 두 역할의 권한을 관리할 수 있습니다. 이를 통해 권한 관리가 더 쉬워집니다. 다음 명령으로 역할 멤버십 정보를 볼 수 있습니다:

role - group manage permissions in PostgreSQL

모든 그룹 구성원은 ‘set role’ 명령을 사용하여 그룹으로 작업할 수 있습니다. ‘postgres’ 사용자는 슈퍼유저이므로 그룹의 구성원이 아니더라도 ‘set role’을 사용할 수 있습니다:

이제 생성하는 모든 테이블은 temporary_role의 소유가 됩니다:

테이블의 소유권을 확인하려면 다음 명령을 실행하세요:

create table with temporary_role

‘temporary_role’ 역할이 새 테이블과 serial 데이터 유형과 관련된 시퀀스를 소유하고 있음을 확인할 수 있습니다. 원래 역할 권한으로 되돌리려면 다음 명령을 실행하세요:

역할이 자신이 속한 역할의 모든 권한을 갖도록 하려면 ‘alter role’ 명령과 함께 ‘inherit’ 속성을 지정할 수 있습니다:

위 명령을 통해 ‘test_user’는 자신이 속한 역할의 모든 권한을 갖게 되었습니다. 역할을 삭제하려면 ‘drop role’ 명령을 사용할 수 있습니다:

drop role manage permissions in PostgreSQL

위 명령은 해당 역할에 의존하는 테이블 ‘hello’와 같은 객체가 있기 때문에 오류를 발생시킵니다. 이를 삭제하려면 테이블의 소유권을 다른 역할로 이전할 수 있습니다:

다음 명령을 사용하여 이제 temporary_role이 소유한 테이블이 없는지 확인할 수 있습니다:

check ownerships

이제 의존성이 없으므로 ‘temporary_role’을 삭제할 수 있습니다:

위 명령어가 temporary_users 역할을 삭제하더라도, 해당 역할 그룹의 이전 구성원들은 제거되지 않습니다.

결론

튜토리얼을 완료하셨습니다. 이제 PostgreSQL에서 권한을 관리하는 방법을 알게 되었습니다. 권한을 쉽게 관리할 수 있습니다. 권한 관리 방법을 알면 애플리케이션이 필요한 데이터베이스에 액세스할 수 있도록 보장하는 동시에 다른 애플리케이션에서 사용하는 다른 데이터베이스에는 액세스하지 못하도록 할 수 있습니다.

즐거운 컴퓨팅 되세요!

author

Akshay Nagpal

작성자 · CloudSigma

Preslav Dobrev는 CloudSigma의 크리에이티브 디자이너로서, 전통적이고 혁신적인 마케팅 채널을 활용하여 일관된 비즈니스 정체성을 구축하는 데 중점을 두고 있습니다. 그는 영향력 있는 브랜드 내러티브를 창출하기 위해 예술적 비전과 전략적 마케팅을 결합하는 데 능숙합니다.

댓글

아직 댓글이 없습니다. 첫 번째로 작성해 보세요.