Node.js를 통해 MySQL을 다루다보면 아래와 같은 에러를 만날 경우가 있다.
“Client does not support authentication protocol requested by server; consider upgrading MySQL client”
노드에서 MySQL을 다루기 위한 모듈이 지금은 mysql2도 있고, 다른 것도 몇가지 있는 것으로 알고 있다. 하지만 그냥 mysql.js를 사용한다면 주의해야 할 부분이 있다. 그리고 첫줄에 있는 에러도 만날 수 있다.
MySQL은 이제 새로운 인증방식으로 caching_sha2_password를 사용한다. 따라서 유저를 생성하면 디폴트로 그 방식을 사용하게 된다. 하지만 mysql모듈을 통해 노드에서 해당 유저에 접근하려고 하면 에러가 발생한다. 이는 그 신규 인증 방식으로 인해 대체된 과거의 인증 방식이 mysql모듈에 적용되지 않았기 때문이다. 노드 mysql모듈을 통해 유저 계정 접근시에는 mysql_native_password (과거 인증방식)을 사용하게 된다.
MySQL X DevAPI for Node라는 대체재 (port:33060)도 있지만, 수동으로 유저 인증 방식을 변경하여 문제를 해결할 수 있다.
아래의 SQL문을 보자.
CREATE USER 'username'@'localhost' IDENTIFIED BY 'the_password';
GRANT ALL PRIVILEGES ON *. * TO 'user_name'@'localhost' WITH GRANT OPTION;
(grant all privileges on DB이름.* to '사용자'@'localhost';)
or
(위의 2줄을 하거나 아래 2줄을 하거나)
CREATE USER 'username'@'%' IDENTIFIED BY 'the_password';
GRANT ALL PRIVILEGES ON *. * TO 'username'@'%' WITH GRANT OPTION;
-- SHOW GRANTS FOR username;
FLUSH PRIVILEGES;
ALTER USER ‘username’@‘localhost’ IDENTIFIED WITH MYSQL_NATIVE_PASSWORD BY 'the_password';
위와 같이 유저 생성 - 권한 부여 - 인증 방식 변경의 절차를 통해 유저를 만들어두면(+인증방식변경)
이제 require('mysql')을 통해 가져온 모듈로 mysql 해당 유저에 자유롭게 접근 가능하다.
위의 방식은 물론 모든 권한을 주는 것이고, ALL PRIVILEGES자리에 권한을 선택적으로 부여할 수 있고,
*.* 자리에 데이터베이스를 선택적으로 넣어줄 수 있다. 그렇게 하면 특정 데이터베이스(들)에 대해서만 권한을 갖게 되는 것이다.