MySQL 보안의 시작은 비밀번호 관리다.
계정 해킹, 내부 유출, 자동화 공격을 막기 위해선 단순한 비밀번호 지정만으로는 부족하다.
MySQL은 다양한 비밀번호 정책과 인증 방식을 제공하며, 이를 잘 활용하면 DB 전체의 보안 수준을 획기적으로 높일 수 있다.

🔐 MySQL의 기본 인증 구조
MySQL 사용자 계정은 mysql.user 테이블에 저장되며, 비밀번호는 해시 처리된 상태로 저장된다.
MySQL 8.0 이후 기본 인증 플러그인은 caching_sha2_password로 변경되었고, 이전 버전에서는 mysql_native_password가 기본이었다.
🔑 비밀번호 인증 플러그인 종류
| 플러그인 이름 | 설명 |
| caching_sha2_password | 기본값 (MySQL 8.0), 빠르고 안전 |
| mysql_native_password | 구버전 호환용, SHA1 기반 |
| sha256_password | 더 강력한 보안용, SHA-256 사용 |
사용자 생성 시 플러그인을 명시할 수 있다.
CREATE USER 'secureuser'@'%' IDENTIFIED WITH caching_sha2_password BY 'StrongPass123!';
📋 비밀번호 정책 설정 (validate_password)
MySQL에는 비밀번호 복잡도와 보안 수준을 검사하는 플러그인이 있다.
validate_password 플러그인을 활성화하면, 다음 항목을 기준으로 검사한다.
| 변수 | 설명 |
| validate_password.length | 최소 비밀번호 길이 (기본: 8) |
| validate_password.mixed_case_count | 대/소문자 포함 개수 |
| validate_password.number_count | 숫자 포함 개수 |
| validate_password.special_char_count | 특수문자 포함 개수 |
| validate_password.policy | LOW, MEDIUM, STRONG 정책 선택 |
활성화 방법:
INSTALL PLUGIN validate_password SONAME 'validate_password.so';
설정 예:
SET GLOBAL validate_password.policy = 'STRONG';
SET GLOBAL validate_password.length = 12;
사용자 생성 시 기준을 충족하지 않으면 오류 발생한다.
⏰ 비밀번호 만료 및 주기 설정
비밀번호를 강제로 주기적으로 변경하도록 설정할 수 있다.
MySQL 8.0 이상에서는 계정 단위로 설정 가능하다.
ALTER USER 'user1'@'%' PASSWORD EXPIRE INTERVAL 90 DAY;
- 90일 후 로그인 시 비밀번호 변경을 요구함
즉시 만료:
ALTER USER 'user1'@'%' PASSWORD EXPIRE;
비밀번호 변경:
ALTER USER 'user1'@'%' IDENTIFIED BY 'NewPass456!';
🚫 비밀번호 재사용 방지와 잠금 정책은?
MySQL 기본 설정에는 비밀번호 재사용 제한이나 계정 잠금 기능이 포함되지 않지만, MySQL Enterprise Edition 또는 외부 인증 시스템 연동으로 보완할 수 있다.
또한, 비밀번호 변경 시 동일한 해시 값이 재사용되지 않도록 validate_password.reuse_check 같은 커스텀 플러그인을 활용할 수도 있다.
🔍 사용자 인증 관련 정보 확인
SELECT user, host, plugin, password_last_changed, password_expired
FROM mysql.user;
- plugin: 인증 방식
- password_expired: 만료 여부 확인 가능
🧠 실무 보안 전략 요약
- MySQL 8.0 이상에선 caching_sha2_password 사용을 권장
- 모든 계정에 비밀번호 만료 주기 설정
- validate_password 플러그인으로 강력한 패스워드 정책 강제
- 사용자마다 최소 12자 이상, 대소문자+숫자+특수문자 조합 적용
- 외부 접속 계정은 반드시 강력한 패스워드 + IP 제한 적용
- 테스트 계정과 기본 사용자 계정은 삭제하거나 무조건 비활성화
✅ 정리
- 비밀번호 관리는 MySQL 보안의 핵심이다.
- 플러그인, 정책, 만료, 복잡도 등을 종합적으로 관리해야 한다.
- 계정 생성 시 인증 플러그인을 지정하고, 정기적인 점검을 수행해야 한다.
- 강력한 비밀번호는 시스템의 첫 방어선이다.
🔗 공식 문서 참고
MySQL 8.0 Reference Manual - Password Management
'DB' 카테고리의 다른 글
| [MySQL] (백업/복구2️⃣) mysqldump 백업과 복원 방법 완벽 가이드 (0) | 2025.07.12 |
|---|---|
| [MySQL] (백업/복구1️⃣) 백업의 모든 것: 개념, 필요성, 전략 총정리 (0) | 2025.07.12 |
| [MySQL] (권한관리7️⃣) 사용자 관리 실수 방지 체크리스트 (0) | 2025.07.11 |
| [MySQL] (권한관리6️⃣) 사용자 권한 확인 및 변경, 삭제 실무 명령어 정리 (2) | 2025.07.11 |
| [MySQL] (권한관리4️⃣) 사용자별 리소스 제한 설정하기 (연결 수, 쿼리 수 등) (2) | 2025.07.10 |
| [MySQL] (권한관리3️⃣) 사용자별 권한 제한: 최소 권한 원칙 실무 적용 (0) | 2025.07.10 |
| [MySQL] (권한관리2️⃣) GRANT 명령어 완전 정복: 실전 예제 모음 (1) | 2025.07.10 |
| [MySQL] (권한관리1️⃣) 사용자 계정과 권한 구조 완벽 이해하기 (1) | 2025.07.09 |