데이터베이스나 테이블 이외의 객체에 적용되는 권한을 글로벌 권한이라고 하며, 데이터베이스나 테이블을 제어하는데 필요한 권한을 객체 권한이라고 한다
객체 권한은 GRANT 명령으로 권한을 부여할 때 반드시 특정 객체를 명시해야 하며, 반대로 글로벌 권한은 GRANT 명령에서 특정 객체를 명시하지 말아야 한다.
글로벌 권한은 GRANT 명령에서 특정 객체를 명시하지 말아야 한다.
예외적으로 ALL은 글로벌과 객체 권한 두 가지 용도로 사용될 수 있는데 특정 객체에 ALL 권한이 부여되면 해당 객체에 적용될 수 있는 모든 객체 권한을 부여하며, 글로벌로 ALL이 사용되면 글로벌 수준에서 가능한 모든 권한을 부여하게 된다.
MySQL에서 권한은 데이터베이스 및 테이블과 같은 특정 리소스에 대한 액세스를 다른 사용자 또는 역할에 부여하거나 거부하는 데 사용됩니다. MySQL에는 전역 권한, 데이터베이스 권한 및 테이블 권한의 세 가지 권한 수준이 있습니다.
글로벌 권한: 전역 권한은 전체 MySQL 서버에 적용되며 모든 데이터베이스와 테이블에 영향을 미칩니다. 전역 권한의 몇 가지 예에는 데이터베이스 생성 또는 삭제, 사용자 계정 관리 및 서버 종료 기능이 포함됩니다. 전역 권한은 일반적으로 전체 MySQL 서버를 관리해야 하는 관리 사용자에게 부여됩니다.
데이터베이스 권한: 데이터베이스 권한은 MySQL의 특정 데이터베이스에 적용됩니다. 데이터베이스 권한의 몇 가지 예에는 테이블 생성 또는 삭제, 테이블 스키마 변경, 테이블의 데이터 선택 또는 수정 기능이 포함됩니다. 데이터베이스 권한은 일반적으로 특정 데이터베이스로 작업해야 하는 사용자에게 부여됩니다.
테이블 권한: 테이블 권한은 MySQL의 특정 테이블에 적용됩니다. 테이블 권한의 몇 가지 예에는 테이블에서 데이터를 선택, 삽입, 업데이트 또는 삭제하는 기능이 포함됩니다. 테이블 권한은 일반적으로 데이터베이스의 특정 테이블로 작업해야 하는 사용자에게 부여됩니다.
MySQL에서 권한을 부여하려면 GRANT 문 다음에 특정 권한, 리소스, 사용자 또는 역할을 사용할 수 있습니다. 예를 들어 사용자에게 전역 권한을 부여하려면 다음 문을 사용할 수 있습니다.
GRANT CREATE, DROP, SHUTDOWN ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';
이 예시는 사용자에게 데이터베이스를 생성 및 삭제하고 MySQL 서버를 종료할 수 있는 권한을 부여합니다. 별표(*)는 모든 데이터베이스와 테이블을 나타냅니다.
*.*은 모든 DB 모든 오브젝트를 포함해서 MySQL전체를 의미한다.
데이터베이스 또는 테이블 권한을 부여하려면 GRANT 문에서 특정 데이터베이스 또는 테이블을 지정할 수 있습니다. 예를 들어 특정 테이블의 사용자에게 SELECT 및 INSERT 권한을 부여하려면 다음 명령문을 사용할 수 있습니다.
GRANT SELECT, INSERT ON mydatabase.mytable TO 'user'@'localhost' IDENTIFIED BY 'password';
이 예시는 사용자에게 "mydatabase" 데이터베이스의 "mytable" 테이블에서 데이터를 선택하고 삽입할 수 있는 권한을 부여합니다.
요약하면 전역, 데이터베이스 및 테이블 권한은 MySQL의 여러 리소스에 대한 액세스를 제어하는 데 사용됩니다. 권한을 부여하고 관리하는 방법을 이해하는 것은 데이터베이스 보안 및 관리의 중요한 측면입니다.
CREATE ROLE명령을 이용해 role_emp_read와 role_emp_write라는 일므의 역할을 정의
CREATE ROLE
role_emp_read
role_emp_write;
아무런 권한이 없는 역할이므로 권한을 부여
GRANT SELECT ON employees.* TO role_emp_read;
GRANT INSERT, UPDATE, DELETE ON employees.* TO role_emp write;
기본적으로 역할은 그 자체로 사용될 수 없고 계정에 부여해야한다
CREATE USER reader@'127.0.0.1' IDENTIFIED BY 'qwerty';
CREATE USER writer@'127.0.0.1' IDENTIFIED BY 'qwerty';
GRANT role_emp_read TO reader@'127.0.0.1';
GRANT role_emp_read, role_emp_write TO writer@'127.0.0.1';
reader계정이 role_emp_read 역할을 사용할 수 있게 하려면 다음과 같이 SET ROLE 명령을 실행해야한다.
SET ROLE 'role_emp_read';
계정이 로그아웃 됐다가 다시 로그인하면 역할이 활성화 되지않은 상태로 초기화되어 버린다.
시스템 변수를 ON으로 설정하면 매번 SET ROLE 명령으로 역할을 활설화하지 않아도 로그인과 동시에 부여된 역할이 자동으로 활성화된다
SET GLOBAL acrivate_all_roles_on_login=ON;
MySQL 서버 내부적으로 계정과 역할은 아무런 차이가 없으며 실제 관리자나 사용자가 볼 때도 역할인지 계정인지 구분하기가 어렵다.
MySQL 서버에서 굳이 CREATE ROLE과 CREATE USER 명령을 구분해서 지원하는 이유는 데이터베이스 관리의 직무를 분리할 수 있게 해서 보안을 강화하는 용도로 사용될 수 있게 하기 위해서이다.