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;

GRANTREVOKE 명령어를 사용하면 일반적으로 즉시 반영되지만, 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'@'%';

참고