티스토리 뷰

✅ 2024-03-23 내용 추가

 

내용 구성

  1. 원인 파악
  2. 해결 방법
  3. 참고

원인 파악

  • 문제 상황

Node.js에서 MySQL을 사용하려던 차, 연결 코드를 작성하고 실행하니 1251 오류가 발생하였다.

Error 1251

검색 결과, 클라이언트 프로그램이 MySQL 패스워드 플러그인인 'caching_sha2_password'를 소화하지 못하기 때문에 발생한다고 한다.

 

 

  • caching_sha2_password

MySQL 8.0에서부터 사용되는 기본 인증 플러그인이다. 데이터베이스 유저의 비밀번호를 SHA-256 알고리즘 기반으로 암호화하여 저장한다. 보안성이 높고, 무단으로 비밀번호를 해독하기 어렵다는 장점이 있다.

그러나 이 방식은 종종 호환성 문제가 발생하는데, 바로 위 같은 경우이다. Node.js에서 설치한 MySQL용 드라이버가 chacing_sha2_password 프로토콜을 지원하지 않는다는 경고 메시지에서 확인할 수 있다.

 

 

 

해결 방법

ALTER USER '[유저명]'@'[% 이나 localhost]' IDENTIFIED WITH mysql_native_password BY '[비밀번호]';

 

따라서 해결 방법은 클라이언트 측이 이해할 수 있는 패스워드 플러그인인 'mysql_native_password'로 변경하면 된다. MySQL에 접속해서 위 명령어를 실행하자.

 

  • 참고로, 'localhost' 대신 '%'를 사용하는 것이 좋다는 스택 오버플로 글을 보았지만, 내 컴퓨터에서는 '%'로 위 SQL이 실행되지 않았다.

 

SELCT user, host, plugin FROM user;

당연하다. Node.js에 접속하려는 root 계정의 host가 'localhost'이다. 호스트가 '%'인 루트 계정이 없기 때문에 당연히 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '비밀번호' 명령어가 실행되지 못 했던 것이다.

또한 'localhost'보다 '%'이 늘 더 좋은 것도 아니다. 만약 개인 프로젝트로, 로컬에서만 개발할 것이라면 오히려 외부에서 접속하지 못하는 'localhost'을 사용하는 것이 더 안전할 것이다.

 

 

  • mysql_native_password

MySQL 8.0 이전에 사용하던 기본 비밀번호 암호화 방법이다. 새로운 caching_sha2_password 프로토콜을 인식하지 못하니, 예전 플러그인을 사용하겠다고 변경해주자. 당연히 caching_sha2_password보단 보안성이 떨어진다.

 

 

  • % or localhost
USE mysql;
SELECT user, host, plugin FROM user;

 

MySQL에서 위 명령어를 실행해서 Node.js에 연결하려는 유저 정보를 확인하자. 만약 host가 localhost라면 명령어에 'localhost'를, '%'라면 '%'를 사용하도록 하자.

localhost는 해당 유저가 로컬 호스트로만 접속할 수 있다는 의미이고, %는 모든 호스트(외부)로부터 해당 유저로 MySQL에 접속할 수 있다는 의미이다.

단, 이때 %을 사용하려면 MySQL 설정 파일에서 외부에서의 접근을 허용하도록 해야 한다. 기본적으로 bind-address = 127.0.0.1로 되어 있는데, 이것을 주석 처리하고 bind-address = 0.0.0.0으로 수정하면 외부 접속이 가능해진다.

 

 

 

참고

https://stackoverflow.com/questions/49194719/authentication-plugin-caching-sha2-password-cannot-be-loaded

 

Authentication plugin 'caching_sha2_password' cannot be loaded

I am connecting MySQL - 8.0 with MySQL Workbench and getting the below error: Authentication plugin 'caching_sha2_password' cannot be loaded: dlopen(/usr/local/mysql/lib/plugin/caching_sha2_pa...

stackoverflow.com

https://lifeinprogram.tistory.com/22

 

[MySQL] MySQL 8.X user 생성 및 변경, 삭제하기/ create user / GRANT ALL PRIVILEGES ON / alter user / drop user / cachin

mysql 8.x user 생성 및 변경, 삭제 처리 하기 > mysql 에 접속하시고 user 테이블로 이동 하셔서 insert into user (Host,User,authentication_string,ssl_cipher,x509_issuer,x509_subject) values ('localhost','유저명', '', '','',''); ins

lifeinprogram.tistory.com

 

728x90