MySQL 역할 생성·할당·기본 활성화 설정하기

목차

MySQL 8 계열에서 반복되는 권한을 역할(Role)로 묶어 관리하는 방법입니다. 원노트의 팀별 역할 예제를 appdb 데이터베이스 읽기 전용 역할로 정리했습니다. 계정에 역할을 할당하는 것과 접속 시 활성화하는 것은 별도 단계입니다.

역할과 계정 생성

관리자 세션에서 실행합니다. appdb는 이미 존재하는 예제 DB이며 암호 자리표시는 실제로 새로 생성한 값으로 바꿉니다. 사용자 계정과 역할 이름은 구분해서 명명합니다.

TERMINAL / CONFIG
CREATE ROLE 'app_read_role';
GRANT SELECT ON appdb.* TO 'app_read_role';
CREATE USER 'lieper'@'localhost' IDENTIFIED BY 'CHANGE_ME_PASSWORD';
GRANT 'app_read_role' TO 'lieper'@'localhost';
SHOW GRANTS FOR 'app_read_role';
SHOW GRANTS FOR 'lieper'@'localhost';

역할의 GRANT 대상 DB·테이블 범위를 확인합니다. 읽기 전용 사용자에게 전체 서버 관리자 권한이나 다른 계정에 권한을 줄 수 있는 GRANT OPTION을 함께 주지 않습니다.

접속 시 역할 활성화

기본 역할을 설정하면 다음 로그인부터 해당 역할이 활성화됩니다. 현재 세션에서는 SET ROLE로 전환할 수 있습니다. CURRENT_ROLE()은 활성화 상태 확인에 사용합니다.

TERMINAL / CONFIG
SET DEFAULT ROLE 'app_read_role' TO 'lieper'@'localhost';
-- lieper 계정으로 다시 접속한 뒤 확인
SELECT CURRENT_USER(), CURRENT_ROLE();
SET ROLE 'app_read_role';
SELECT CURRENT_ROLE();

activate_all_roles_on_login은 서버 전체의 역할 활성화 동작에 영향을 주므로 개별 사용자 기본 역할 설정과 구분합니다. 일반적인 CREATE USER·GRANT 문 실행 뒤 FLUSH PRIVILEGES를 매번 실행할 필요는 없습니다.

변경과 회수 확인

역할의 권한을 바꾸면 그 역할을 사용하는 계정에 영향을 줍니다. 역할 자체를 삭제하기 전에 연결된 사용자와 사용 중인 애플리케이션을 확인합니다.

TERMINAL / CONFIG
REVOKE 'app_read_role' FROM 'lieper'@'localhost';
SHOW GRANTS FOR 'lieper'@'localhost';

다른 세션에서 읽기 성공과 쓰기 거부를 각각 확인합니다. 권한이 없다는 오류가 나면 실제 접속한 user@host, 역할의 DB 범위, 현재 활성 역할 순서로 확인합니다.
참고: https://dev.mysql.com/doc/refman/8.4/en/roles.html

DB › MySQL
MySQL 목록