티스토리 뷰
[MySQL] Error 1251: Client does not support authentication protocol requested by server; consider upgrading MySQL client 해결 방법
leego 2022. 7. 23. 20:27✅ 2024-03-23 내용 추가
내용 구성
- 원인 파악
- 해결 방법
- 참고
원인 파악
- 문제 상황
Node.js에서 MySQL을 사용하려던 차, 연결 코드를 작성하고 실행하니 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이 실행되지 않았다.
당연하다. 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://lifeinprogram.tistory.com/22
'개발 > 데이터베이스' 카테고리의 다른 글
[MySQL] 서로 다른 데이터베이스로 데이터 이전하기 (0) | 2024.03.24 |
---|---|
MongoDB 기본 명령어 (쓰기, 읽기) (0) | 2022.01.14 |
[윈도우window] MongoDB community server 설치하기 (0) | 2022.01.14 |
[맥MAC] 몽고DB 설치하기 (0) | 2022.01.13 |