역할은 PostgreSQL에서 개별 사용자나 사용자 그룹을 나타낼 수 있어. 역할은 데이터베이스, 테이블, 스키마, 그리고 다른 오브젝트에 대한 접근을 관리하지.
역할을 만들면, 기본적으로 특정 사용자나 그룹에 묶여 있진 않아. 하지만 네가 원하는 대로 속성과 권한을 부여할 수 있어.
역할과 사용자의 차이
그럼 사용자(user)는 뭐가 다를까? 헷갈리지 말자! PostgreSQL에서는 사용자도 역할로 취급돼. 하지만 차이점이 있는데, 사용자는 항상 시스템에 로그인할 수 있는 권한이 있어. 즉, 역할에 LOGIN 속성이 있으면 그 역할이 사용자가 되는 거야. 만약 역할을 단순히 그룹으로 쓰거나 로그인 권한을 주고 싶지 않으면 LOGIN 속성을 안 넣으면 돼.
예시:
LOGIN속성이 있는 역할 = 사용자.LOGIN없는 역할 = 그룹 또는 "서비스 역할".
역할 만들기
역할을 만들 때는 CREATE ROLE 명령어를 써. 문법은 이렇게 돼:
CREATE ROLE <역할_이름> [WITH] [파라미터];
여기서 파라미터는 역할의 속성들이야. 예를 들면:
LOGIN— 데이터베이스에 로그인할 수 있음.CREATEDB— 데이터베이스를 만들 수 있음.CREATEROLE— 다른 역할을 만들 수 있음.SUPERUSER— 모든 권한(진짜 위험하니까 조심해서 써).PASSWORD— 인증용 비밀번호.
예시로 사용자 역할을 만들어보자. 예를 들어 student라는 사용자를 만들고, 로그인 권한과 비밀번호를 주고 싶으면 이렇게 하면 돼:
CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';
이 명령어는 student라는 이름의 역할을 만들고, 데이터베이스에 접속할 수 있게 해줄 거야.
이번엔 teachers라는 그룹 역할을 만들어보자. 그룹 역할은 LOGIN 속성이 필요 없어. 그룹에 속한 사용자들이 자기 계정으로 로그인하면 되니까.
CREATE ROLE teachers;
역할에 권한 부여하기
PostgreSQL에서 역할은 리소스 접근을 허용하거나 제한하려고 만들어. 이때 GRANT와 REVOKE 명령어를 써.
GRANT로 권한 주기
명령어 문법은 이래:
GRANT <권한> ON <오브젝트> TO <역할>;
예를 들어 courses 테이블을 만들고, teachers 역할에 읽기/쓰기 권한을 주고 싶으면 이렇게 해:
-- 테이블 만들기
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
teacher_id INT
);
-- 접근 권한 주기
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;
이제 teachers 역할에 속한 모든 사용자는 테이블에서 데이터를 조회, 추가, 수정할 수 있어.
REVOKE로 권한 회수하기
권한을 회수하려면 REVOKE 명령어를 써. 문법은 이래:
REVOKE <권한> ON <오브젝트> FROM <역할>;
예를 들어 teachers 그룹이 courses 테이블에서 데이터를 수정하지 못하게 하려면 이렇게 해:
REVOKE UPDATE ON courses FROM teachers;
역할 계층 구조: 상속
사용자는 그룹 역할에서 권한을 "상속"받을 수 있어. 이러면 관리가 훨씬 편해져. 마치 한 사람이 다른 사람에게 "유산"을 넘겨주는 것처럼!
INHERIT 키워드를 쓰면 역할이 다른 역할의 권한을 상속받을 수 있어. 이건 기본값이야. 필요하면 바꿀 수도 있어.
예시:
-- 사용자 `john`을 `teachers` 그룹에 추가
GRANT teachers TO john;
이제 john 사용자는 teachers 그룹 역할에 부여된 모든 권한을 자동으로 가지게 돼.
권한 확인해보자:
\du john
상속을 끄고 싶으면, 역할을 NOINHERIT 속성으로 만들면 돼.
CREATE ROLE admin NOINHERIT;
이제 admin 역할에 속한 사용자는 기본적으로 그 권한을 쓸 수 없어.
접근 관리를 위한 역할 그룹 만들기
역할 그룹을 쓰면 접근 관리가 훨씬 쉬워져. 특히 프로젝트가 커질수록! 각 사용자마다 권한을 따로 주는 대신, 그룹에 사용자를 추가하고 그룹에 권한을 주면 돼.
간단한 그룹 역할 예시를 들어볼게. 그룹을 이렇게 만들어보자:
students— 학생 그룹.teachers— 선생님 그룹.
CREATE ROLE students;
CREATE ROLE teachers;
사용자를 그룹에 추가하자:
-- john 사용자를 students 그룹에 추가
GRANT students TO john;
-- jane 사용자를 teachers 그룹에 추가
GRANT teachers TO jane;
이제 students와 teachers 그룹에 테이블 접근 권한을 주면, 그 그룹에 속한 모든 사용자에게 자동으로 권한이 생겨!
실습 과제
exams테이블을 만들고 필드는 다음과 같이 해:id: 기본 키;subject: 텍스트;teacher_id: 선생님 ID.
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
students와teachers역할 그룹을 만들어.
CREATE ROLE students;
CREATE ROLE teachers;
teachers그룹에exams테이블의 데이터 추가/수정 권한을 줘.
GRANT INSERT, UPDATE ON exams TO teachers;
students그룹에는 읽기 권한만 줘.
GRANT SELECT ON exams TO students;
alice사용자를 만들고students그룹에 추가해.
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
alice계정으로 접속해서 어떤 권한이 있는지 확인해봐.
이제 역할을 만들고, 권한을 관리하고, 그룹 역할로 관리가 얼마나 쉬워지는지 알았지? 다음 강의에서는 GRANT와 REVOKE 명령어로 데이터베이스, 스키마, 테이블 단위로 더 세밀하게 접근 권한을 설정하는 방법을 배울 거야.
GO TO FULL VERSION