#ER_NOT_SUPPORTED_AUTH_MODE
#npmmysql
코딩을 하다보면 항상 느끼는거지만, "원인"이 무엇인지 알아야 가장 좋은 해결책을 찾을 수 있다. 이런 오류가 하나씩 나오면 원인을 분석해서 기록해 놓아야 나에게도 도움이 되는듯 하다. 더불어 똑같은 문제로 고민하고 있을 많은 사람들에게도 도움이 되길 바라며.
npm으로 mysql을 설치하고, 노드몬으로 실행하는데 이런 에러가 떴다.
예전같았으면 ??? 이런 상태로 1-2시간 헤메다가 어찌 해결된지도 모르고 넘어갔을텐데, 이제는 코딩이 컴퓨터와 대화한다는 생각을 하고 나니 한결 에러를 대하기가 편해졌다. '지금 이런 에러가 났으니 고쳐줘' 라고 말한다고 느끼고 나니 코딩하다 나는 에러들을 자세히 보고 원인을 찾아내게 된듯 하다.
<에러 전문>
C:\Users\SJ\Desktop\elice\study\back\index.js:12
if (error) throw error;
^
Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
at Handshake.Sequence._packetToError (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\protocol\sequences\Sequence.js:47:14)
at Handshake.ErrorPacket (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\protocol\sequences\Handshake.js:123:18)
at Protocol._parsePacket (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\protocol\Protocol.js:291:23)
at Parser._parsePacket (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\protocol\Parser.js:433:10)
at Parser.write (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\protocol\Parser.js:43:10)
at Protocol.write (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\protocol\Protocol.js:38:16)
at Socket.<anonymous> (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\Connection.js:88:28)
at Socket.<anonymous> (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\Connection.js:526:10)
at Socket.emit (node:events:527:28)
at addChunk (node:internal/streams/readable:315:12)
--------------------
at Protocol._enqueue (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\protocol\Protocol.js:144:48)
at Protocol.handshake (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\protocol\Protocol.js:51:23)
at Connection.connect (C:\Users\SJ\Desktop\elice\study\back\node_modules\mysql\lib\Connection.js:116:18)
at Object.<anonymous> (C:\Users\SJ\Desktop\elice\study\back\index.js:9:12)
at Module._compile (node:internal/modules/cjs/loader:1105:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
at Module.load (node:internal/modules/cjs/loader:981:32)
at Function.Module._load (node:internal/modules/cjs/loader:822:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12)
at node:internal/main/run_main_module:17:47 {
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
}
[nodemon] app crashed - waiting for file changes before starting...
<원인>
mysql 8.0 버전부터 보안이 강화된 caching_sha2_password를 쓰는데, node와 호환이 안되서 발생하는 문제라고 한다.
자세한 내용은 아래 스택오버플로우를 참고. 아래에 쓰는 모든 내용은 다 여기에 있는 내용을 정리한것이다.
MySQL 8.0 - Client does not support authentication protocol requested by server; consider upgrading MySQL client
I can't make a simple connection to the server for some reason. I install the newest MySQL Community 8.0 database along with Node.JS with default settings. This is my node.js code var mysql =
stackoverflow.com
--> 이 오류를 찾아보면
대부분 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호'; 명령어를 치면 된다고 나오는데, 이게 비밀번호 설정과 호환을 위해서 그런것 같다.
그런데 나는 위의 명령어를 쳐도 안됐다. 이건 아래에서 해결방법에 다시 이야기 하도록 하겠다.
<해결 방법>
[첫번째 해결책] mySQL installer에서 설정 바꿔주기
이 방법은 한마디로 해서 mySQL installer에 들어가, "나 mysql 8.0 버전보안 말고 예전에 쓰던 보안방법 쓸래" 라고 설정하는 거다.
1. mySQL intaller를 들어간다.
2. mySQL Server에서 Reconfigure 클릭
3. 설정에 들어가면 next를 누르고
Authentication Method에서 Use Legacy Authentication Method(Retain MySQL 5.x Compatibility) 선택
next로 마지막까지 넘어가고 Execute 누르기
설정을 바꾸고 다시 노드몬을 실행하니 제대로 연결이 된걸 볼 수 있었다.
그런데...
이렇게 설정을 했는데 작성을 하다보니 또 똑같은 오류가 나기 시작했다.
그래서 결국 다른 해결책을 찾아야만 했다.
그리하여 찾게된 스택오버플로우 해답 정리
[두번째 해결책] - 스택오버플로우: 추천하지 않는다고 했음
스택오버플로우에서 해결책으로 준것중에 제일 추천하지 않는 방법이
아까 위에서 쓴, ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호';
이 명령어를 사용하는거다.
왜 비추하는지 보니 mysql을 다운그레이드 하고, 예전에 쓰던 방식으로 보안을 쓴다고 하는 명령이라고 한다.
그러면 굳이 mysql8.0을 쓸 필요가 없어서 이 명령어 사용하는걸 비추하는것 같았다.
아마 [첫번째 해결책]으로 나왔던 방법을 다른 방식으로 똑같이 적용하는것 같은 느낌의 해결책이었다.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호';
위의 명령어를 사용하고 나서 꼭 flush privileges; 를 해주어야 한다.
[세번째 해결책] -스택오버플로우 : 쏘쏘한 해결책이라고 함
음... 이건 해보려다 그냥 나는 그 다음에 나오는 제일 추천하는 방식으로 결국 넘어가서 따로 길게 해석은 안했다.
그냥 참고용으로 넣어둠.
[네번째 해결책] - 스택오버플로우에서 추천하는 방법: mysql 패키지를 mysql2 패키지로 바꿔서 받아라
스택오버플로우에서 이 방법을 가장 추천했다.
그래서 난 결국 해보다가 다 안되어서 mysql2 패키지로 바꿔서 받았다.
아래 명령어는 기존에 깔았던 mysql을 삭제하고, mysql2를 받는 명령어이다.
npm un mysql && npm i mysql2
결국 나는 네번째 방법인 mysql2를 이용하는 방법을 쓰게 되었다. mysql2는 보안상의 에러가 나는거를 해결해서 나온 업그레이드된 npm인듯 했다.
+ 그리고 이런 문제를 다들 겪다보니 mysql2의 다운로드 수가 mysql 보다 더 높았다.
mysql2는 22년 10월 기준 110만명이 받았고
mysql은 90만명이 받았다.
mysql2가 더 많이 쓰이기도 하고, 현재 있는 문제를 가장 빨리 해결할 수 있는 방법인듯 하니 꼭 mysql을 이용해야 하는 상황이 아니라면 mysql2를 다운로드 받아서 사용하는걸 추천한다.
<결론>
[첫번째 방법] 나는 되다가 안되었다. mySQL installer 이용
1. mySQL intaller를 들어간다.
2. mySQL Server에서 Reconfigure 클릭
3. 설정에 들어가면 next를 누르고
Authentication Method에서 Use Legacy Authentication Method(Retain MySQL 5.x Compatibility) 선택
next로 마지막까지 넘어가고 Execute 누르기 , 다시 실행
[두번째 - 비추] 명령어 사용
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '비밀번호';
flush privileges;
[세번째 - 쏘쏘] 이건 위의 본문 참고.
[네번째 - 가장 추천] mysql 지우고 mysql2 패키지로 다시 받기.
명령어: npm un mysql && npm i mysql2