MySQL 8 계열에서 반복되는 권한을 역할(Role)로 묶어 관리하는 방법입니다. 원노트의 팀별 역할 예제를 appdb 데이터베이스 읽기 전용 역할로 정리했습니다. 계정에 역할을 할당하는 것과 접속 시 활성화하는 것은 별도 단계입니다.
역할과 계정 생성
관리자 세션에서 실행합니다. appdb는 이미 존재하는 예제 DB이며 암호 자리표시는 실제로 새로 생성한 값으로 바꿉니다. 사용자 계정과 역할 이름은 구분해서 명명합니다.
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()은 활성화 상태 확인에 사용합니다.
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를 매번 실행할 필요는 없습니다.
변경과 회수 확인
역할의 권한을 바꾸면 그 역할을 사용하는 계정에 영향을 줍니다. 역할 자체를 삭제하기 전에 연결된 사용자와 사용 중인 애플리케이션을 확인합니다.
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