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