MySQL의 사용자 및 권한 설정에 대해서 알아보도록 하겠습니다.
MySQL에서는 사용자 계정을 생성 / 각 계정의 권한을 설정하는 방법이 다른 DBMS와의 차이가 있다,
1. 사용자 식별
- 사용자 계정 뿐만 아니라 사용자의 접속 지점(클라이언트가 실행된 호스트명이나 도메인 또는 IP 주소)도 계정의 일부가 된다.
- 따라서, MySQL에서 계정을 언급할 때는 항상 아이디와 호스트를 함께 명시해야 한다.
( 같은 아이디라도 접속하는 위치(호스트)가 다르면 완전히 다른 계정으로 취급하기 때문))
- 따옴표(`) : 식별자를 감싸는 따옴표 역할. 홑따옴표(’)로 바뀌어서 사용되기도 한다.
2. 사용자 계정 관리
2.1 시스템 계정과 일반 계정
- SYSTEM_USER 권한을 가지고 있는지 유무에 따라 나뉜다.
- 시스템 계정 (System Account) : 데이터베이스 서버 관리자를 위한 계정
- 일반 계정 (Regular Account) : 응용 프로그램이나 개발자를 위한 계정
| 시스템 계정 | 일반 계정 |
| 시스템 계정과 일반 계정을 관리(생성 삭제 및 변경) 가능 | 시스템 계정을 관리할 수 없음 |
- 시스템 계정으로만 실행이 가능한 것]
- 계정 관리 (계정 생성 및 삭제, 계정의 권한 부여 및 제거)
- 다른 세션(Connection) 또는 그 세션에서 실행 중인 쿼리를 강제 종료
- 스토어드 프로그램 생성 시 DEFINER를 타 사용자로 설정
2.2 계정 생성
MySQL 5.7 버전까지는 GRANT 명령으로 권한의 부여와 동시에 계정 생성이 가능했다.
하지만, MySQL 8.0 버전부터는 계정의 생성은
- CREATE USER : 계정의 생성
- 권한 부여 : GRANT 명령
으로 구분해서 실행하도록 바뀌었다.
계정을 생성할 때 다양한 옵션을 설정할 수 있다.
- 계정의 인증 방식과 비밀번호
- 비밀번호 관련 옵션(비밀번호 유효 기간, 비밀번호 이력 개수, 비밀번호 재사용 불가 기간)
- 기본 역할(Role)
- SSL 옵션
- 계정 잠금 여부
[각 옵션]
- IDENTIFIED WITH : 사용자 인증 방식과 비밀번호를 설정한다
- REQUIRE : MySQL 서버에 접속할 떄 암호화된 SSL/TLS 채널의 사용여부 설정
- PASSWORd EXPIRE : 비밀번호의 유효 기간을 설정한느 옵션
- PASSWORD HISTORY : 한 번 사용했던 비밀번호를 재사용하지 못하게 하는 설정
- PASSWORD REUSE INTERVAL : 한 번 상용했떤 비밀번호의 재사용 금지 기간을 설정하는 옵션
- PASSWORD REQUIRE : 비밀번호가 만료되어 새로운 비밀번호로 변경할 때 현재 비밀번호를 필요로 할지 말지를 결정하는 옵션
- ACCOUNT LOCK/UNLOCK : 계정 생성 시 또는 ALTER USER 명령을 사용해 계정 정보를 변경할 때 계정을 사용하지 못하게 잠글지 여부를 결정
3. 비밀번호 관리
3.1 고수준 비밀번호
MySQL 서버의 비밀번호는 유효기간이나 이력 관리를 통한 재사용 금지 기능뿐만 아니라 비밀번호를 쉽게 유추할 수 있는 단어들이 사용되지 않게 글자의 조합을 강제하거나 금칙어를 설정하는 기능도 있다.
- MySQL 서버에서 비밀번호의 유효성 체크 규칙을 적용 → validate_password 컴포넌트를 이용2.) 컴포넌트에서 제공하는 시스템 변수 혹인
- LOW : 비밀번호의 길이만 검증
- MEDIUM : 비밀번호의 길이를 검증하며, 숫자와 대소문자, 그리고 특수문자의 배합을 검증
- STRONG : MEDIUM 레벨의 검증을 모두 수행하며, 금칙어가 포함됐는지 여부까지 검증
- 3.) 비밀번호 정책은 크게 다음 3가지 중에서 선택할 수 있으며, 기본값은 MEDIUM으로 자동 설정된다.
- 1.) validate_password 컴포넌트 설치
3.2 이중 비밀번호
계정의 비밀번호로 2개의 값을 동시에 사용할 수 있는 기능
MySQL 서버의 이중 비밀번호 기능 : 하나의 계정에 대해 2개의 비밀번호를 동시에 설정할 수 있음
2개의 비밀번호는 프라이머리, 세컨더리 로 구분됨
- 프라이머리(Primary) 비밀번호 : 최근에 설정된 비밀번호
- 세컨더리(Secondary) 비밀번호 : 이전 비밀번호
4. 권한 (Prifilege)

- 글로벌 권한 : 데이터베이스나 테이블 이외의 객체에 적용되는 권한
- 객체 권한 : 데이터베이스나 테이블을 제어하는 데 필요한 권한
- 정적 권한 : MySQL 소스코드에 고정적으로 명시되어 있는 권한
- 동적 권한 : MySQL 서버가 시작되면서 동적으로 생성하는 권한
5. 역할 (Role)
권한을 묶어서 역할(Role)을 사용할 수 있게 됨.
CREATE ROLE - 빈 껍데기만 있는 역할을 부여
GRANT 명령 - 역할에 대한 실질적인 권한을 부여함