티스토리 뷰

문제

간단한 프로젝트를 만들기 위해 개발 초기 셋팅 단계에서 MySQL을 Docker 컨테이너로 구성해 연결하려는 과정에서
컨테이너 생성은 정상적으로 되었는데 Node.js에서 MySQL에 연결하려는 순간 에러가 발생했다.

Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client

{
 code: 'ER_NOT_SUPPORTED_AUTH_MODE',
 errno: 1251,
 sqlMessage: 'Client does not support authentication protocol requested by server; consider upgrading MySQL client',
 sqlState: '08004',
 fatal: true
}

 

 

 

원인

MySQL 서버에 접속하려면 아이디와 비밀번호로 인증하는데, 그 인증 과정에서 사용하는 기본 인증 방식이 MySQL 8.0.4부터
mysql_native_password에서 caching_sha2_password 바뀌었다.
현재 내가 쓰는 MySQL도 이 정책이 적용된 이후 버전이기 때문에 클라이언트가 이 방식과 호환되지 않아서 에러가 발생한 것이다.

 

 

 

해결 방법

해결 방법엔 2가지가 있다.

필자는 보안이 민감한 서비스나 장기적 운영 서비스를 만드는게 아니라 간단한 프로젝트를 만드는 과정이기 때문에 방법 1을 선택했다.

 

방법 1. 인증 방식을 mysql_native_password로 바꾸기

mysql_native_password가 이전 인증 방식이지만 Node.js MySQL 클라이언트가 잘 지원하는 방식이라 호환성이 문제되지 않는다.
그래서 서버는 mysql_native_password 방식으로 인증을 요청하고 클라이언트는 문제 없이 인증할 수 있게 될 것이다.

 

1. 도커 컨테이너 접속

docker exec -it <컨테이너 이름> mysql -u root -p

 

2. 비밀번호 입력하여 MySQL 콘솔에서 다음 쿼리 실행

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'mypassword';
FLUSH PRIVILEGES;

 

3. 종료

exit;

 

4. 컨테이너 재시작

docker restart <컨테이너 이름>

 

 

방법 2. mysql2로 라이브러리 바꾸기

mysql2는 Node.js에서 MySQL에 접속하기 위한 MySQL 클라이언트 라이브러리로,

기존 mysql과 거의 동일한 API를 제공하면서 + 성능 개선 및 최신 인증 방식(caching_sha2_password)을 지원한다.

보안이나 확장성을 고려하면 mysql2가 장기적으로 더 좋을 수 있으니 각자 개발하는 서비스 운영에 따라 선택하는 것을 권장한다.

 

mysql2로 전환하는 방법은 mysql2를 설치해주면 된다.

npm uninstall mysql   # (선택사항)mysql와 mysql2 둘이 공존해도 되기 때문에 기존 mysql 제거는 선택사항이다.
npm install mysql2

 

 

 

 

 

참고

https://dev.mysql.com/blog-archive/mysql-8-0-4-new-default-authentication-plugin-caching_sha2_password/?utm_source=chatgpt.com

 

MySQL :: MySQL 8.0.4 : New Default Authentication Plugin : caching_sha2_password

Starting with MySQL 8.0.4, we are changing the default authentication plugin for MySQL server from mysql_native_password to caching_sha2_password. Correspondingly, libmysqlclient will now use caching_sha2_password as the default authentication mechanism, t

dev.mysql.com

https://dev.mysql.com/doc/mysql-secure-deployment-guide/8.0/en/secure-deployment-configure-authentication.html?utm_source=chatgpt.com

 

MySQL :: MySQL Secure Deployment Guide :: 11 Enabling Authentication

Chapter 11 Enabling Authentication When a client connects to the MySQL server, the server uses the user name provided by the client and the client host to select the account row from the mysql.user table. The server authenticates the client, determining

dev.mysql.com

 

 

 

Total
Today
Yesterday