DB

[MySQL] (권한관리2️⃣) GRANT 명령어 완전 정복: 실전 예제 모음

인생아 2025. 7. 10. 12:47
반응형

MySQL에서 권한을 부여할 때 사용하는 핵심 명령어는 GRANT다.
GRANT는 단순히 권한만 부여하는 게 아니라, 접속 제어, 객체 접근 범위, 데이터 조작 권한까지 통합적으로 관리하는 보안 도구다.
실무에서는 최소 권한 원칙을 따르면서도, 개발자·운영자·분석가 등 역할에 따라 정확히 권한을 나누는 것이 중요하다.

🧱 GRANT 기본 문법

GRANT 권한목록 ON 대상 TO '사용자'@'호스트';

예:

GRANT SELECT, INSERT ON mydb.* TO 'appuser'@'192.168.0.%';
  • mydb.* : mydb 데이터베이스 내 모든 테이블에 적용
  • 'appuser'@'192.168.0.%' : 해당 IP 대역의 사용자에게 권한 부여

📂 대상 범위 이해

대상 설명
*.* 모든 데이터베이스와 테이블
mydb.* 특정 DB의 모든 테이블
mydb.users 특정 테이블만 지정
mydb.users (email, name) 컬럼 단위 권한 (MySQL 8.0+)

범위 지정이 정확하지 않으면 예상치 못한 접근 권한이 발생할 수 있다.

반응형

🧪 실전 예제 모음

✅ 1. 읽기 전용 계정 만들기

CREATE USER 'readonly'@'%' IDENTIFIED BY 'safe123!';
GRANT SELECT ON mydb.* TO 'readonly'@'%';
  • 조회만 가능하며 데이터 수정은 불가능

✅ 2. 개발자 전용 권한 부여

CREATE USER 'dev'@'%' IDENTIFIED BY 'devpass';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, ALTER ON devdb.* TO 'dev'@'%';
  • 개발 환경 전용 DB에 CRUD + 구조 변경 권한까지 부여

✅ 3. 특정 테이블만 접근 허용

GRANT SELECT ON mydb.logs TO 'logger'@'10.0.0.%';
  • logs 테이블만 읽을 수 있도록 설정

✅ 4. 트리거, 이벤트 권한 추가

GRANT TRIGGER, EVENT ON mydb.* TO 'devops'@'%';
  • 이벤트 기반 처리 가능

✅ 5. 루틴(Stored Procedure) 사용 권한

GRANT EXECUTE ON PROCEDURE mydb.calculate_salary TO 'hruser'@'%';
  • 프로시저만 실행 가능하도록 설정

✅ 6. GRANT OPTION 부여

GRANT ALL PRIVILEGES ON mydb.* TO 'admin'@'localhost' WITH GRANT OPTION;
  • admin 사용자가 다른 사용자에게도 권한을 줄 수 있음
  • 매우 주의해서 사용해야 함
반응형

🔒 최소 권한 전략 실천 팁

  • 실무에서는 ALL PRIVILEGES 사용을 자제한다
  • SELECT, INSERT, UPDATE, DELETE 등 필요한 권한만 선별해서 부여
  • 데이터 조회만 필요한 사용자에게는 SELECT만
  • 운영 DB에는 ALTER, DROP, GRANT OPTION은 제외
  • IP 제한을 걸어 'user'@'%' 대신 'user'@'10.0.0.%' 형태로 설정

🧠 실무에서 자주 묻는 질문

Q. GRANT 후 바로 적용되나요?
A. 네, 즉시 적용된다. 별도 FLUSH PRIVILEGES 필요 없음

Q. 기존 권한은 삭제되나요?
A. 아니다. GRANT는 권한을 "추가"할 뿐이며 기존 권한은 유지됨

Q. 사용자 생성과 동시에 권한도 줄 수 있나요?
A. MySQL 8.0부터는 가능하다

CREATE USER 'dataeng'@'%' IDENTIFIED BY 'pw' PASSWORD EXPIRE INTERVAL 90 DAY;
GRANT SELECT ON analytics.* TO 'dataeng'@'%';

🔎 권한 확인 방법

SHOW GRANTS FOR 'readonly'@'%';

해당 계정에 부여된 권한을 모두 확인 가능

❌ 권한 제거는 REVOKE

REVOKE INSERT, UPDATE ON mydb.* FROM 'dev'@'%';

권한 실수 시에는 REVOKE로 부분 제거하거나, DROP USER로 계정을 삭제한 뒤 재생성하는 게 더 안전한 경우도 많다.

✅ 정리

  • GRANT는 역할 기반 권한 분리를 실현하는 핵심 도구다
  • 실무에서는 최소 권한 원칙을 지키며 사용자마다 정확히 범위를 나눠야 한다
  • GRANT, REVOKE, SHOW GRANTS는 권한 관리를 위한 핵심 명령어다
  • 모든 권한 변경은 문서화하고 정기 점검이 필요하다

🔗 공식 문서 참고
MySQL 8.0 Reference Manual - GRANT Syntax

반응형