반응형
MySQL에서 클라이언트와 서버 간 통신은 기본적으로 평문(Plain text)이다.
따라서 암호화를 설정하지 않으면 ID, 비밀번호, 쿼리, 결과값까지 그대로 네트워크를 타고 전달된다.
이런 환경에서는 중간자 공격(Man-in-the-Middle)이나 패킷 스니핑에 매우 취약하다.
이를 방지하기 위해 MySQL은 SSL/TLS 기반의 암호화 통신 기능을 제공한다.
이번 글에서는 MySQL에서 데이터를 전송할 때 암호화 통신을 설정하는 방법과
SSL 인증서 적용 흐름, 그리고 실무에서 주의할 점까지 정리한다.

✅ in transit 암호화란?
- 네트워크를 통해 전송 중인 데이터 자체를 암호화하는 방식
- 공격자가 네트워크를 감청해도 내용을 읽을 수 없도록 보호
- TLS 기반의 SSL 인증서 연결 설정으로 구현
🔐 MySQL에서 SSL 통신을 사용하려면?
- 서버와 클라이언트 모두 SSL 인증서를 설정해야 함
- 최소 3가지 파일이 필요함
- CA 인증서 (ca.pem)
- 서버 인증서 (server-cert.pem)
- 서버 키 (server-key.pem)
이 파일들은 직접 생성할 수도 있고, 내부 인증기관 또는 Let's Encrypt 등에서 발급받을 수도 있다.
반응형
🛠️ 1단계: SSL 인증서 생성
테스트 용도로는 openssl 명령어로 직접 생성 가능
# CA 인증서 생성
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 365 -key ca-key.pem -out ca.pem
# 서버 인증서
openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem
openssl x509 -req -in server-req.pem -days 365 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
# 클라이언트 인증서도 동일 방식으로 생성 가능
🛠️ 2단계: MySQL 서버 설정
my.cnf 또는 mysqld.cnf 설정 파일에 아래 항목 추가
[mysqld]
ssl-ca = /etc/mysql/ssl/ca.pem
ssl-cert = /etc/mysql/ssl/server-cert.pem
ssl-key = /etc/mysql/ssl/server-key.pem
MySQL 재시작 후 적용
sudo systemctl restart mysql
설정 적용 여부는 아래 쿼리로 확인 가능
SHOW VARIABLES LIKE '%ssl%';
have_ssl 값이 YES이면 SSL 통신 활성화 완료된 상태다.
반응형
🛠️ 3단계: 클라이언트 접속 확인
MySQL 클라이언트로 SSL 옵션을 붙여 접속
mysql -u root -p --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem
또는 JDBC에서 SSL 옵션을 붙이는 경우
jdbc:mysql://hostname:3306/dbname?useSSL=true&requireSSL=true&verifyServerCertificate=true
접속 후 SSL 사용 여부 확인
SHOW SESSION STATUS LIKE 'Ssl_version';
SSL 버전이 출력되면 암호화 통신이 정상적으로 적용된 것이다.
🧠 실무 적용 팁
- 서버와 클라이언트 둘 다 인증서를 갖고 있어야 양방향 인증이 가능함
- 인증서는 파일 권한(600) 설정, 키 유출 방지 필수
- 클라우드 환경(GCP, AWS)에서는 RDS, Cloud SQL에서 자동 적용 지원
- SSL 통신은 CPU 사용량이 증가하므로 서버 리소스를 고려해야 함
- MySQL 8.0 이상에서는 require_secure_transport = ON 설정으로 SSL 강제 가능
[mysqld]
require_secure_transport = ON
이 설정을 하면 일반 연결은 모두 거부되고, 반드시 SSL을 사용해야 접속할 수 있다.
📘 공식 문서 참고
https://dev.mysql.com/doc/refman/8.0/en/using-encrypted-connections.html
반응형
'DB' 카테고리의 다른 글
| [MySQL] (복제구조2️⃣) Master-Slave 복제 설정 실습 가이드 (0) | 2025.07.16 |
|---|---|
| [MySQL] (복제구조1️⃣) MySQL 복제란? 구조와 개념 완전 정리 (0) | 2025.07.16 |
| [MySQL] (보안설정5️⃣) 실무에서 자주 놓치는 보안 설정 체크리스트 (0) | 2025.07.16 |
| [MySQL] (보안설정4️⃣) SSL 인증서 적용하기: OpenSSL 기반 실습 가이드 (1) | 2025.07.16 |
| [MySQL] (보안설정2️⃣) 데이터 at rest 암호화 설정법: 테이블·디스크 암호화 실무 가이드 (0) | 2025.07.16 |
| [MySQL] (보안설정1️⃣) 데이터 암호화가 필요한 이유와 기본 개념 정리 (1) | 2025.07.16 |
| [MySQL] (트랜잭션 격리수준5️⃣) 실무에서 격리 수준 설정은 이렇게 한다 (1) | 2025.07.16 |
| [MySQL] (트랜잭션 격리수준4️⃣) 격리 수준별 현상 실습: Dirty ~ Phantom Read (0) | 2025.07.16 |