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

Onam Kwon·2023년 5월 13일
0

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


node_app  | Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client
node_app  |     at Handshake.Sequence._packetToError (/app/node_modules/mysql/lib/protocol/sequences/Sequence.js:47:14)
node_app  |     at Handshake.ErrorPacket (/app/node_modules/mysql/lib/protocol/sequences/Handshake.js:123:18)
node_app  |     at Protocol._parsePacket (/app/node_modules/mysql/lib/protocol/Protocol.js:291:23)
node_app  |     at Parser._parsePacket (/app/node_modules/mysql/lib/protocol/Parser.js:433:10)
node_app  |     at Parser.write (/app/node_modules/mysql/lib/protocol/Parser.js:43:10)
node_app  |     at Protocol.write (/app/node_modules/mysql/lib/protocol/Protocol.js:38:16)
node_app  |     at Socket.<anonymous> (/app/node_modules/mysql/lib/Connection.js:88:28)
node_app  |     at Socket.<anonymous> (/app/node_modules/mysql/lib/Connection.js:526:10)
node_app  |     at Socket.emit (node:events:513:28)
node_app  |     at addChunk (node:internal/streams/readable:315:12)
node_app  |     at readableAddChunk (node:internal/streams/readable:289:9)
node_app  |     at Socket.Readable.push (node:internal/streams/readable:228:10)
node_app  |     at TCP.onStreamRead (node:internal/stream_base_commons:190:23)
node_app  |     --------------------
node_app  |     at Protocol._enqueue (/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
node_app  |     at Protocol.handshake (/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
node_app  |     at PoolConnection.connect (/app/node_modules/mysql/lib/Connection.js:116:18)
node_app  |     at Pool.getConnection (/app/node_modules/mysql/lib/Pool.js:48:16)
node_app  |     at Pool.query (/app/node_modules/mysql/lib/Pool.js:202:8)
node_app  |     at MySQLStore.query (/app/node_modules/express-mysql-session/index.js:439:33)
node_app  |     at MySQLStore.set (/app/node_modules/express-mysql-session/index.js:240:8)
node_app  |     at Session.save (/app/node_modules/express-session/session/session.js:72:25)
node_app  |     at Session.save (/app/node_modules/express-session/index.js:406:15)
node_app  |     at ServerResponse.end (/app/node_modules/express-session/index.js:335:21)
node_app  |     at ServerResponse.send (/app/node_modules/express/lib/response.js:232:10)
node_app  |     at /app/app.js:65:28
node_app  |     at Layer.handle [as handle_request] (/app/node_modules/express/lib/router/layer.js:95:5)
node_app  |     at trim_prefix (/app/node_modules/express/lib/router/index.js:328:13)
node_app  |     at /app/node_modules/express/lib/router/index.js:286:9
node_app  |     at Function.process_params (/app/node_modules/express/lib/router/index.js:346:12)
node_app  |     at Immediate.next (/app/node_modules/express/lib/router/index.js:280:10)
node_app  |     at Immediate.<anonymous> (/app/node_modules/express/lib/router/index.js:646:15)
node_app  |     at processImmediate (node:internal/timers:468:21)
  • docker-compose 를 이용해 node.js 서버 컨테이너와 MySQL 데이터베이스 컨테이너 두개를 연결하려다 위와같은 에러를 만났습니다.
  • 구글을 해보니 이를 해결하기 위해 여러가지 방법이 있었으며 대부분의 게시글에서 보안적으로 좋지 않은 방법을 제시하고 있었습니다. 스택오버플로우에서 이에 대해 설명과 보안을 유지하며 해결하는 방법을 답변한 질문이 있는데 해당 게시글에 작성하겠습니다.

원인

  • 시작하기에 앞서, 이런 상황이 일어나는 이유를 설명하겠습니다.
  • MySQL은 여러가지 버전을 출시해 왔으며 MySQL에는 authentication method 라는것이 존재합니다.
    • authentication method란 사용자가 MySQL 서버에 로그인 하기 위해 사용하는 인증 방식을 나타냅니다.
  • MySQL7 까지는 기본 mysql_native_password 방식을 사용했으나 MySQL8 부터 caching_sha2_password 방식이 기본 인증 방식이 되었습니다.
    • caching_sha2_password 방식은 이전 방식보다 보안성이 높으며, SHA-256을 사용해 비밀번호를 암호화 합니다. 이 방식을 사용하면 중간자 공격으로 부터 보다 안전하게 데이터를 보호할 수 있습니다.
  • 위 에러가 나타난 이유는 노드 패키지인 mysql.js 모듈이 caching_sha2_password 방식을 지원하지 않아서 그렇습니다.

해결

  • 구글링으로 찾은 대부분의 해결책은 단순히 아래와 같았습니다.
  • 대부분 아래의 쿼리를 MySQL 에서 실행하는 방법을 추천합니다.
  • 아래 쿼리는 해당 계정의 authentication methodmysql_native_password로 바꾸는 작업을 수행합니다.
    • 따라서 보안에 좋지 않으며 몇몇 게시글에서는 개인 프로젝트나 연습용으로 할 때 사용하라고 권하는 경우도 있습니다.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
  • roo는 해당 계정, localhost 는 해당 계정의 URL, password는 해당 계정의 비밀번호로 대체합니다.
  • 그 후 아래를 연달아 실행합니다.
flush privileges;
  • 위 방법으로 해결이 되지 않는다면, @'localhost'를 제외하고 실행합니다.
  • 이 방법을 통해 로그인을 할 때 사용하는 인증 방식을 기존에 사용하던 방식으로 변경할 수 있습니다.
  • 위 에러가 나타나는 근본적인 원인은 결국 mysql.js 모듈이 caching_sha2_password 인증 방식을 지원하지 않아서 나타나는 경우로 이를 지원하는 패키지를 사용하면 해결할 수 있습니다.
  • mysql2.js 모듈이 새로운 인증 방식을 지원하므로 이를 사용하면 위 에러를 해결 할 수 있습니다.
npm un mysql && npm i mysql2
  • 터미널에서 위 명령어를 통해 mysql 모듈을 지우고 mysql2 모듈을 설치할 수 있습니다.

References

profile
권오남 / Onam Kwon

0개의 댓글