MySQL 사용자 관리 완벽 가이드
English (N/A)
MySQL을 운영하다 보면 서비스별, 팀원별로 사용자를 나누고 적절한 권한을 부여해야 하는 상황이 자주 발생합니다. 이 글에서는 사용자 생성부터 권한 관리까지 실무에서 바로 쓸 수 있는 명령어를 정리합니다.
기본적인 MySQL 문법은 MySQL 완벽 가이드를 참고한다.
사용자 생성
기본 생성
-- 모든 호스트에서 접속 가능한 사용자 생성
CREATE USER 'worker'@'%' IDENTIFIED BY 'your_password';
@ 뒤의 호스트 부분은 해당 사용자가 어디서 접속할 수 있는지를 결정합니다.
호스트 제한
-- 로컬에서만 접속 가능
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'your_password';
-- 특정 IP에서만 접속 가능
CREATE USER 'app'@'10.0.1.100' IDENTIFIED BY 'your_password';
-- 특정 서브넷에서 접속 가능
CREATE USER 'app'@'10.0.1.%' IDENTIFIED BY 'your_password';
-- 모든 호스트에서 접속 가능
CREATE USER 'worker'@'%' IDENTIFIED BY 'your_password';
실무에서는 보안을 위해 가능한 한 호스트를 제한하는 것이 좋습니다. % 는 개발 환경이나 VPC 내부에서 주로 사용합니다.
사용자 조회 및 삭제
-- 사용자 목록 조회
SELECT user, host FROM mysql.user;
-- 사용자 삭제
DROP USER 'worker'@'%';
비밀번호 변경
ALTER USER 'worker'@'%' IDENTIFIED BY 'new_password';
권한 부여 (GRANT)
전체 권한 부여
-- 모든 데이터베이스의 모든 테이블에 전체 권한 부여
GRANT ALL PRIVILEGES ON *.* TO 'worker'@'%';
*.* 에서 첫 번째 * 는 데이터베이스, 두 번째 * 는 테이블을 의미합니다. 이 권한은 슈퍼유저급이므로 운영 환경에서는 신중하게 사용해야 합니다.
데이터베이스 단위 권한
-- shop_db 데이터베이스의 모든 테이블에 UPDATE 권한만 부여
GRANT UPDATE ON shop_db.* TO 'dev_user'@'%';
테이블 단위 권한
-- 특정 테이블에 전체 권한 부여
GRANT ALL PRIVILEGES ON myapp.orders TO 'worker'@'%';
GRANT ALL PRIVILEGES ON myapp.order_items TO 'worker'@'%';
-- 특정 테이블에 SELECT 권한만 부여 (읽기 전용)
GRANT SELECT ON analytics.customers TO 'report_ro'@'%';
함수/프로시저 실행 권한
-- 특정 함수에 대한 실행 권한 부여
GRANT EXECUTE ON FUNCTION myapp.fn_calculate_tax TO 'report_ro'@'%';
자주 사용하는 권한 목록
| 권한 | 설명 |
|---|---|
ALL PRIVILEGES | 모든 권한 |
SELECT | 데이터 조회 |
INSERT | 데이터 삽입 |
UPDATE | 데이터 수정 |
DELETE | 데이터 삭제 |
CREATE | 테이블/DB 생성 |
DROP | 테이블/DB 삭제 |
ALTER | 테이블 구조 변경 |
INDEX | 인덱스 생성/삭제 |
EXECUTE | 함수/프로시저 실행 |
GRANT OPTION | 다른 사용자에게 권한 부여 가능 |
권한 회수 (REVOKE)
-- shop_db 데이터베이스에서 DROP 권한 회수
REVOKE DROP ON shop_db.* FROM 'dev_user'@'%';
GRANT 와 동일한 형태로 REVOKE ... FROM 구문을 사용합니다.
권한 확인
-- 특정 사용자의 권한 확인
SHOW GRANTS FOR 'dev_user'@'%';
결과에 GRANT USAGE ON *.* 만 표시되면 해당 사용자에게 아무 권한이 없다는 뜻입니다. USAGE 는 "접속만 가능하고 아무 작업도 할 수 없음"을 의미합니다.
권한 반영
FLUSH PRIVILEGES;
GRANT 나 REVOKE 명령어를 사용하면 일반적으로 즉시 반영되지만, mysql.user 테이블을 직접 수정한 경우에는 반드시 FLUSH PRIVILEGES 를 실행해야 합니다.
실무 팁
읽기 전용 사용자 만들기
BI 도구나 모니터링 용도로 읽기 전용 사용자를 만들 때 유용합니다.
CREATE USER 'readonly'@'%' IDENTIFIED BY 'your_password';
GRANT SELECT ON mydb.* TO 'readonly'@'%';
FLUSH PRIVILEGES;
서비스별 사용자 분리
마이크로서비스 환경에서는 서비스별로 사용자를 분리하고 필요한 권한만 부여하는 것이 좋습니다.
-- 워커 서비스용 (특정 테이블만 접근)
CREATE USER 'worker_svc'@'10.0.%' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON mydb.jobs TO 'worker_svc'@'10.0.%';
GRANT ALL PRIVILEGES ON mydb.job_logs TO 'worker_svc'@'10.0.%';
-- API 서비스용 (전체 데이터베이스 접근)
CREATE USER 'api_svc'@'10.0.%' IDENTIFIED BY 'your_password';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'api_svc'@'10.0.%';
위험한 권한 분리
DROP, ALTER, GRANT OPTION 같은 위험한 권한은 일반 사용자에게 부여하지 않는 것이 좋습니다.
-- 안전한 권한만 부여
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app'@'%';
-- 실수로 DROP 권한이 포함된 경우 회수
REVOKE DROP ON mydb.* FROM 'app'@'%';
참고
- MySQL 완벽 가이드 - 기본 SQL 문법 정리
- MySQL CREATE USER 공식 문서
- MySQL GRANT 공식 문서