반응형
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;
플러그인의 권한을 바꿔주고 즉시 적용해 주자.
플러그인이 변경된 것을 확인할 수 있다.
발생했던 오류도 깔끔히 해결되었다.
반응형