글로벌 권한과 객체 권한
- 데이터베이스나 테이블 이외의 객체에 적용되는 권한을 글로벌 권한이라고 한다.
- 데이터베이스나 테이블을 제어하는 데 필요한 권한을 객체 권한이라고 한다.
- 객체 권한은 Grant 명령으로 권한을 부여할 때 반드시 특정 객체를 명시해야 한다.
- 예외적으로 ALL은 글로벌과 객체 권한 두 가지 용도로 사용될 수 있다
- 특정 객체에 ALL 적용 시, 해당 객체에 적용될 수 있는 모든 객체권한을, 글로벌 ALL 적용시, 글로벌 수준에서 가능한 모든 권한을 부여하게 된다.
정적 권한과 동적 권한
MySQL :: Security in MySQL :: 4.2 Privileges Provided by MySQL
Security in MySQL / Access Control and Account Management / Privileges Provided by MySQL 4.2 Privileges Provided by MySQL The privileges granted to a MySQL account determine which operations the account can perform. MySQL privileges differ in the
dev.mysql.com
- 정적 권한은 MySQL 서버의 소스코드에 고정적으로 명시돼 있는 권한을 의미한다.
MySQL :: Security in MySQL :: 4.2 Privileges Provided by MySQL
Security in MySQL / Access Control and Account Management / Privileges Provided by MySQL 4.2 Privileges Provided by MySQL The privileges granted to a MySQL account determine which operations the account can perform. MySQL privileges differ in the
dev.mysql.com
- MySQL 서버가 시작되면서 동적으로 생성되는 권한을 의미한다.
- MySQL5.7 버전까지는 SUPER 권한이 데이터베이스를 관리하기 위한 필수 권한이었다면, MySQL 8.0 이후부터는 잘게 쪼개어져 동적 권한으로 분산됐다.
- 백업 관리자와 복제 관리자 개별로 꼭 필요한 권한만 부여할 수 있게 되었다.
Grant
GRANT SUPER ON *.* TO 'user'@'localhost'
-- 글로벌 권한 *.*
GRANT SUPER ON *.* TO 'user'@'localhost'
-- DB 권한
GRANT EVENT ON *.* TO 'user'@'localhost'
GRANT EVENT ON employees.* TO 'user'@'localhost'
-- 테이블 권한
GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'user'@'localhost'
GRANT SELECT, INSERT, UPDATE, DELETE ON employees.* TO 'user'@'localhost'
GRANT SELECT, INSERT, UPDATE, DELETE ON employees.department TO 'user'@'localhost'
-- 특정 컬럼
GRANT SELECT, INSERT, UPDATE(dept_name) ON employees.department TO 'user'@'localhost'
- 사용자에게 권한을 부여할 때 사용하는 명령어로, 각 권한의 특성에 따라 Grant 명령의 on 절에 명시되는 오브젝트의 내용이 바뀌어야 한다.
- MySQL 8.0 이후 버전부터는 존재하지 않는 사용자에게 Grant 명령 실행 시 오류가 발생한다.
- Grant Option 권한은 다른 권한과 달리 Grant 명령 마지막에 With Grant Option을 명시해서 부여한다.
- privilige_list에는 구분자를 사용해, 권한 여러 개를 동시에 명시할 수 있다.
- to 키워드 뒤에는 권한을 부여할 대사 사용자를 명시한다.
- on 키워드 뒤에는 어떤 DB 오브젝트에 권한을 부여할지 결정할 수 있다.
- 글로벌 권한은 항상 *.*를 사용한다.(MySQL 전체 서버)
- DB 권한은 특정 DB에 대해서, 부여하거나 서버에 존재하는 모든 DB에 권한을 부여할 수 있다.
- 단 테이블까지 명시는 불가능하다.
- 테이블 권한은 모든 DB, 특정 DB, 특정 DB의 특정 테이블에 대해서 권한을 부여할 수 있다.
- 테이블의 특정 칼럼에 대해서만 권한을 부여하는 경우에는 INSERT, UPDATE, SELECT 3가지만 부여할 수 있으며, 각 권한 뒤에 칼럼을 명시하는 형태로 부여한다.
- 테이블과 특정 컬럼 단위 권한은 잘 사용하지 않는데, 권한 설정 시, 나머지 모든 테이블의 모든 컬럼에 대해서도 권한 체크를 해야하기 때문에 성능에 영향을 끼칠 수 있기 때문이다.
- 컬럼 단위 접근이 꼭 필요하다면 별도의 뷰를 만들어 사용하는 방법도 있다(뷰의 컬럼에 대한 권한 체크는 하지 않고 뷰 자체에 대한 권한만 체크하기 때문)
권한 설정 관련 테이블 정보
| 구분 | 저장 테이블 | 설명 |
| 정적 권한 | mysql.user | 계정 정보, 계정이나 역할에 부여된 글로벌 권한 |
| mysql.db | 계정이나 역할에 DB 단위로 부여된 권한 | |
| mysql.tables_priv | 계정이나 역할에 테이블 단위로 부여된 권한 | |
| mysql.columns_priv | 계정이나 역할에 컬럼 단위로 부여된 권한 | |
| mysql.procs_priv | 계정이나 역할에 스토어드 프로그램 단위로 부여된 권한 | |
| 동적 권한 | mysql.global_grants | 계정이나 역할에 부여되는 동적 글로벌 권한 |