DB

[MySQL] (권한관리1️⃣) 사용자 계정과 권한 구조 완벽 이해하기

인생아 2025. 7. 9. 14:13
반응형

MySQL의 보안은 사용자 계정과 권한에서 시작된다.
불필요한 권한을 가진 계정 하나가 전체 시스템을 위협할 수 있고, 반대로 너무 제한된 권한은 개발과 운영 효율을 떨어뜨릴 수 있다.
따라서 MySQL을 운영하는 모든 개발자와 DBA는 사용자 계정 구조와 권한 체계를 정확히 이해해야 한다.

👤 사용자 계정의 구성 방식

MySQL의 사용자 계정은 단순히 사용자명만으로 관리되지 않는다.
사용자명@호스트 형태로 구분되며, 같은 사용자명이라도 접속 호스트에 따라 다른 계정으로 인식된다.

예시:

CREATE USER 'admin'@'localhost' IDENTIFIED BY 'pw1234';
CREATE USER 'admin'@'%' IDENTIFIED BY 'pw5678';
  • 'admin'@'localhost': 로컬 접속 전용 계정
  • 'admin'@'%': 모든 외부 IP 허용

이처럼 동일한 사용자명이라도 호스트가 다르면 별도 계정으로 동작한다.

반응형

🧱 MySQL 계정 관리 시스템 테이블

MySQL은 내부적으로 mysql 시스템 데이터베이스에서 사용자 및 권한 정보를 관리한다.
중요한 테이블은 다음과 같다.

테이블명 역할
user 사용자 기본 정보 및 전역 권한 저장
db 특정 DB에 대한 권한
tables_priv 테이블 단위 권한
columns_priv 컬럼 단위 권한
procs_priv 프로시저/함수 권한
global_grants (8.0+) 동적 권한 관리
 

SELECT * FROM mysql.user; 명령어로 전체 사용자 목록과 전역 권한을 확인할 수 있다.

🧑‍💻 사용자 생성 기본 문법

사용자 계정은 CREATE USER 명령어로 생성한다.

CREATE USER 'devuser'@'192.168.0.%' IDENTIFIED BY 'strongpass!';
  • 'devuser'@'192.168.0.%': 해당 IP 대역에서 접속 허용
  • IDENTIFIED BY: 패스워드 지정

MySQL 8.0 이상에서는 caching_sha2_password가 기본 인증 플러그인으로 설정된다.

🔐 사용자 권한의 구조

MySQL 권한은 크게 다음 4가지로 나눌 수 있다.

  1. 전역 권한 (Global Privileges)
    • 모든 DB에 대해 적용
    • mysql.user 테이블에 저장
  2. DB 권한 (Database Privileges)
    • 특정 DB에만 적용
    • mysql.db 테이블에 저장
  3. 테이블 권한 (Table Privileges)
    • 특정 테이블 단위로 부여
  4. 컬럼/프로시저 권한
    • 컬럼 단위, 저장 루틴 단위의 세밀한 권한 제어 가능

권한은 GRANT 명령어로 부여하고, REVOKE 명령어로 제거한다.

반응형

📊 주요 권한 종류 요약

권한 설명
SELECT, INSERT, UPDATE, DELETE DML 작업
CREATE, DROP, ALTER 객체 생성/삭제
INDEX, TRIGGER 성능, 이벤트 제어
GRANT OPTION 다른 사용자에게 권한 부여 허용
ALL PRIVILEGES 모든 권한 일괄 부여
 

권한은 조합해서 부여 가능하며, 필요 이상으로 부여하는 건 보안상 매우 위험하다.

🔎 현재 사용자 권한 확인

SHOW GRANTS FOR 'devuser'@'192.168.0.%';

현재 계정에 부여된 권한을 SQL 형식 그대로 확인할 수 있어, 백업/재설정에 유용하다.

🧠 실무 운영 팁

  • 운영 DB에는 % 대신 정확한 IP 또는 VPN 대역만 허용하도록 설정한다
  • 반드시 비밀번호 정책을 적용하고 주기적 변경을 강제한다
  • 권한 변경 이력은 별도 문서로 기록하거나 감사 로그에 남긴다
  • 불필요한 권한은 제거, 더 이상 사용하지 않는 계정은 DROP USER로 삭제한다
  • 관리자 외에는 GRANT OPTION 절대 부여 금지

✅ 정리

  • MySQL의 사용자 계정은 사용자명@호스트 형태로 동작한다
  • 권한은 전역 → DB → 테이블 → 컬럼 수준으로 세분화되어 있다
  • 실무에서는 최소 권한 원칙을 지키고, 정기적으로 사용자 권한을 점검해야 한다
  • 시스템 테이블(mysql.user 등)을 통해 내부 구조를 파악하면 보안 관리에 유리하다
  • SHOW GRANTS, CREATE USER, GRANT, REVOKE는 필수 명령어다

🔗 공식 문서 참고
MySQL 8.0 Reference Manual - User Account Management

반응형