
[Nest] 91105 - 2024. 12. 30. 오전 2:04:46
ERROR [TypeOrmModule] Unable to connect to the database. Retrying (1)...
Error: ER_NOT_SUPPORTED_AUTH_MODE:
Client does not support authentication protocol requested by server;
consider upgrading MySQL client
“클라이언트가 서버에서 요구하는 인증 방식을 지원하지 않는다” 라는 의미이다.
MySQL 8.0부터 기본 인증 방식이 caching_sha2_password로 변경되었다. 나의 버전은 현재

9.0.1이다. 음.. 이유는 딱히 없다. 굳이 따지자면 8.0을 썼어야 할 거 같다.
mysql 드라이버(특히 mysql 패키지)는 이 방식을 기본적으로 지원하지 않는다. 왜 지원하지 않을까?
mysql 드라이버는 여전히 MySQL 5.x에서 사용하던 mysql_native_password 방식만 기본적으로 지원한다.
consider upgrading MySQL client라는 메시지가 나오는 것은 클라이언트(드라이버)가 서버(MySQL 8.0)의 최신 인증 방식(caching_sha2_password)을 지원하지 않기 때문이다.

흠… 어떻게 해야할까?
두 가지 해결책이 있다.
mysql_native_password 를 사용하도록 변경Plugin mysql_native_password reported:
''mysql_native_password' is deprecated and will be removed in a future release. Please use caching_sha2_password instead'
1번으로 진행하여 어차피 바꿔봤자 위와 같은 경고 메세지가 나온다. 추천되지 않는 방식이라는 것.
왜 추천되지 않는 지는 아래에 있다.
그렇다면 베스트는 당연히 오래된 인증 메커니즘을 사용하지 않고 최신 MySQL이 지원하는 인증 방식을 사용하는 것이 베스트이겠다.
mysql2 에서는 기본적으로 caching_sha2_password 지원하기에 해당 버전으로 다시 install 했다. 그럼에도 해결이 되지 않았다.
TypeOrmModule.forRoot에 driver: require('mysql2') 를 추가했다.
type: 'mysql'만 설정하면 내부적으로 'mysql' 패키지를 사용하려고 시도한다.mysql2 패키지를 설치했는데도 적용이 안 된 이유는 무엇인가?

const mysql = this.options.driver || PlatformTools.load(connectorPackage)this.mysql = mysql
이 부분에서 this.options.driver가 없으면 기본적으로 'mysql' 패키지를 로드하도록 되어있다는 사실을 알 수 있다. options에 driver를 명시적으로 지정하지 않으면, TypeORM은 기본적으로 mysql 패키지를 사용하게 된다는 의미.
해당 인증 플러그인을 MySQL에서 추천하지 않는 이유는 간단하다.
보안성이 취약하기 때문이다.
물론 개인 프로젝트 측면에서는 전혀 문제가 없긴 하다..하하
하지만 개인 프로젝트 트러블 슈팅의 묘미 아닐까 한다 이런 것들을 해결하는 과정 자체가