[ Express ] Node.js와 MySQL Database 연동/MySQL Preferred Authentication Plugin 오류 해결
Node/Express

[ Express ] Node.js와 MySQL Database 연동/MySQL Preferred Authentication Plugin 오류 해결

반응형

Express에서 MySQL에 접속해 보자.

const express = require('express')
const app = express()

const mysql = require('mysql');
const connection = mysql.createConnection({
  host: '[ 공인 IP 또는 localhost ]',  // 데이터베이스 주소
  port: '3306',  // 데이터베이스 포트
  user: 'root',  // 로그인 계정
  password: 'password',  // 비밀번호
  database: 'database'  // 액세스할 데이터베이스
});

connection.connect();

connection.query('SELECT 1 + 1 AS solution;', function(err, rows, fields) {
    if (err) throw err;
    console.log('The solution is: ', rows[0].solution);
});
  
connection.end();

localhost로 접속할 경우 위의 코드가 오류 없이 실행된다면 연결에 성공한 것이다.

나는 AWS EC2에 설치해 둔 MySQL에 외부 접속을 시도했는데 아래와 같은 오류가 발생했다.

딱히 어려운 작업이 아닌데 갑자기 발생해서 당황스러웠다. 오류를 살펴보자.

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에서 외부 접속을 비허용 하고 있다는 내용이다.

select host, user, plugin, authentication_string from mysql.user;

현재 MySQL의 플러그인 및 인증 문자열에 관한 정보를 검색하자.

확인해 보니 현재 기본 인증 플러그인은 caching_sha2_password로 MySQL 8 이상의 버전부터 더 안전한 비밀번호 암호화를 위해 적용되었다고 공식 문서에 안내돼 있다. 해당 플러그인으로 호환성 문제가 발생할 경우 이전 버전에서 사용하는 플러그인인 mysql_native_password를 사용해 해결하라고 한다.

ALTER USER '[ 사용자명 ]'@'%' IDENTIFIED WITH mysql_native_password BY '[ 사용자 비밀번호 ]';
flush privileges;

플러그인의 권한을 바꿔주고 즉시 적용해 주자.

플러그인이 변경된 것을 확인할 수 있다.

발생했던 오류도 깔끔히 해결되었다.

반응형