문제 상황
현재 백엔드는 typeORM, NestJS, MySQL을 사용해서 구성했다.
AWS의 RDS를 만들고 MySQL을 연결해서 서버를 켜려는데 위와 같은 오류가 발생했다.
원인 파악
RDS를 만들고나서 DBEAVER나 MySQL 익스텐션으로 연결을 했을 땐 문제가 없었기 때문에 MySQL 자체의 문제가 아니라 서버와 연결하는 과정에서 문제가 있을 것이라고 생각했다.
일단, 에러의 내용에 따라 MySQL 클라이언트의 버전에 문제가 있나 싶어 버전을 업그레이드 하고 호환되는 버전을 맞춰봤지만 여전히 똑같은 에러가 발생했다.
여러 블로그 글들을 찾아보니 이 문제는 클라이언트 프로그램에서 MySQL 패스워드 플러그인 "caching_sha2_password"를 소화하지 못해서 생기는 오류라는 것을 알게 되었다.
원래 MySQL의 default_authentication_plugin(기본 인증 플러그인)은 mysql_native_password었다. 하지만 MySQL 8부터 보안이 강화된 caching_sha2_password로 변경되면서 MySQL 클라이언트가 caching_sha2_password 방식을 지원하지 못하는 경우 이런 에러가 발생하게 된다.
(MySQL 모듈이 caching_sha2_password 방식을 지원하지 못해서 생기는 문제)
해결 방안
해결 방법은 크게 두 가지로 나뉘어진다. (1번 방식을 권장한다.)
1. caching_sha2_password 방식을 지원하는 mysql2 모듈을 사용 (권장)
2. default_authentication_plugin(기본 인증 플러그인)을 mysql_native_password로 다운그레이드
[방법1]
기존 연결할 때 시도했던 mysql 패키지를 삭제한다.
npm uninstall mysql
mysql2 패키지를 다운로드 한다.
npm install mysql2
[방법2]
방법2는 두 가지 방식으로 할 수 있다.
① mysql 콘솔 이용
mysql 콘솔로 들어가서 플러그인을 바꿔주면 되는데, 아래 명령어를 입력하면 된다.
ALTER USER '아이디'@'주소' IDENTIFIED WITH mysql_native_password BY '비밀번호';
수정이 완료되었다면, 아래의 명령어를 이용해 확인해 볼 수 있다.
mysql> SELECT Host,User,plugin,authentication_string FROM mysql.user;
② MySQL의 설정파일인 my.cnf 파일 수정
my.cnf 파일은 일반적으로 다음 경로에 위치해 있다.
// Windows
C:\ProgramData\MySQL\MySQL Server 8.0\my.ini 또는 C:\Program Files\MySQL\MySQL Server 8.0\my.ini
// macOS 또는 Linux
/etc/mysql/my.cnf
MySQL의 설정 파일인 my.cnf 파일에 다음과 같이 추가해서 설정할 수 있다.
[mysqld]
default_authentication_plugin=mysql_native_password
참고한 블로그
https://jhyeok.com/nodejs-mysql8/
https://github.com/ZeroCho/nodejs-book/issues/45
https://sirius7.tistory.com/52