본문 바로가기
Books/RealMySQL 8.0

3.4 권한

by 두두리안 2021. 10. 4.
728x90

MySQL 5.7 버전까지 권한은 글로벌 권한과 객체 단위의 권한으로 구분됐다

데이터 베이스나 테이블 이외의 객체에 적용되는 권한을 글로벌 권한이라고 하며,

데이터 베이스나 테이블을 제어하는데 필요한 권한을 객체 권한이라 한다

- 객체 권한은 GRANT 명령으로 권한을 부여할 때 반드시 특정 객체를 명시

- 글로벌 권한은 GRANT 명령에서 특정 객체를 명시하지 말아야 한다


예외적으로 ALL은 글로벌과 객체 권한 두 가지 용도로 사용될 수 있다

- 특정 객체에 ALL 권한이 부여되면 해당 객체에 적용될 수 있는 모든 객체 권한 부여

- 글로벌로 ALL이 사용되면 글로벌 수준에서 가능한 모든 권한을 부여

- 책 65p 표 3.1 정적권한, 표 3.2 동적 권한 참조


## 사용자에게 권한을 부여할 때는 GRANT 명령을 사용
## mysql 5.7
## mysql 8.0 에서 Illegal privilege level specified for table 오류가 발생
## Illegal privilege level specified for table -> 테이블에 잘못된 권한 수준이 지정
GRANT privilege_list ON db.table TO 'user'@'localhost';
## mysql 8.0 
GRANT ALL privileges on db.table to 'user'@'localhost';

- MySQL 8.0 버전부터는 존재하지 않은 사용자에 대해 GRANT 명령이 실행되면 에러가 발생한다

- 사용자를 먼저 생성하고 GRANT 명령으로 권한 부여

- GRANT OPTION 권한은 다른 권한과 달리 GRANT 명령의 마지막에 WITH FRANT OPTION을 명시해서 부여

- privilege_list 에는 구분자(,)를 써서 앞의 표에 명시된 권한 여러 개를 동시에 명시

- TO 키워드 뒤에는 권한을 부여할 대상 사용자를 명시

- ON 키워드 뒤에는 어떤 DB의 어떤 오브젝트에 권한을 부여할지 결정 (권한범위에 따라 사용하는 방법이 달라짐)


글로벌 권한

## 글로벌 권한
## MySQL 8.0 부터는 SUPER 많은 권한을 주어서 지원하지 않을 예정
## SUPER 권한은 서버환경변수를 바꿀수 있다
GRANT SUPER ON *.* TO 'user'@'localhost';

## ALL 권한은 GRANT 권한을 제외한 가능한 모든 옵션을 부여하는 기능
GRANT ALL ON *.* TO 'user'@'localhost';

- 글로벌 권한은 특정 DB나 테이블에 부여될 수 없기 때문에 글로벌 권한을 부여할때 GRANT 명령의 ON 절에는 항상 *.* 사용

- *.*은 모든 DB의 모든 오브젝트 (테이블, 스토어드, 프로시저나 함수) 를 포함해서 MySQL 서버 전체를 의미한다

- CREATE USER나 CREATE ROLE과 같은 글로벌 권한은 DB 단위나 오브젝트 단위로 부여할 수 있는 권한이 아니다

- 항상 *.* 로만 대상을 사용할수 있다


DB 권한

## DB 권한
GRANT EVENT ON *.* TO 'user'@'localhost';
GRANT EVENT ON employees.* TO 'user'@'localhost';

- DB 권한은 특정 DB에 대해서만 권한을 부여하거나 서버에 존재하는 모든 DB에 대한 권한을 부여할 수 있다

- 위 예제 같이 ON 절에 *.* 이나 employees.* 모두 사용할 수 있다

- 여기서 DB는 DB내부에 존재하는 테이블뿐만 아니라 스토어드 프로그램들도 모두 포함된다

- 하지만 DB 권한만 부여하는 경우에는 (DB 권한은 테이블에 대해 부여할 수 없기 때문에) employees.department 테이블 명시 x


테이블 권한

## 테이블 권한
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.departments TO 'user'@'localhost';

- 첫 번째 예제와 같이 서버의 모든 DB에 대해 권한을 부여하는 것도 가능

- 두 번째 예제와 같이 특정 DB의 오브젝트에 대해서만 권한 부여하는 것도 가능

- 세 번째 예제와 같이 특정 DB의 테이블에 대해서만 권한을 부여하는 것도 가능하다


테이블의 특정 칼럼에 대해서만 권한을 부여하는 경우에는 GRANT 명령의 문법이 달라져야 한다

## 테이블의 특정 칼럼에 대해서 권한을 부여한느 경우
GRANT SELECT,INSERT,UPDATE(dept_name) ON employees.departments TO 'user'@'localhost';

- 권한은 DELETE를 제외한 INSERT, UPDATE, SELECT 3가지

- 각 권한 뒤에 칼럼을 명시하는 형태로 부여

728x90

'Books > RealMySQL 8.0' 카테고리의 다른 글

4.1 MySQL 엔진 아키텍처(1)  (0) 2021.10.09
3.5 역할(Role)  (0) 2021.10.04
3.3 비밀번호 관리  (0) 2021.10.03
3.2 사용자 계정관리  (0) 2021.10.02