PHP의 PDO(PHP Data Objects) 기능을 사용하여 데이터베이스를 사용하고자 할 때 주로 다음과 같은 PHP 코드를 사용합니다.
try { $db_conn = new PDO("mysql:host=localhost;dbname=mydatabase;charset=utf8", "username", "password"); } catch (PDOException $e) { echo "데이터베이스 연결 에러! : " . $e; }
그런데 다음과 같이 PDOException
에러가 발생하며 데이터베이스 서버에 접속되지 않는 경우가 있습니다.
PDO::__construct(): The server requested authentication method unknown to the client [caching_sha2_password]
이는 웹 서버에서 접속을 요청한 데이터베이스 서버에서 MySQL Server 8.0 버전 이상을 사용할 때에 나타나는 문제입니다. MySQL Server 5.7 버전을 사용하다가 업그레이드 된 MySQL을 설치하게되면서 예전에는 없었던 문제가 나온 것이기도 합니다. php의 데이터베이스를 연결하는 함수에서 MySQL 8.0의 최신 인증 기술인 caching_sha2 인증을 지원하지 않아서 발생하는 것입니다.
PHP PDO caching_sha2_password 문제 해결
이 문제를 해결하려면 php가 MySQL Server 8.0을 제대로 지원해주는 방안이 나올 때 까지 MySQL Server를 5.7 이하 버전으로 유지하는 것이 좋을 듯 싶습니다.
만약 그래도 MySQL Server 8.0을 계속 사용해야 한다면, 현재 데이터베이스 서버에서 사용 중인 사용자 인증 기능을 기존의 인증 방식(MySQL Native Password Authentication)으로 바꾸는 방법이 있습니다. (이 방법은 PHP 공식 문서인 다음 경로에서도 설명되어 있습니다 : https://www.php.net/manual/en/ref.pdo-mysql.php)
먼저 MySQL Server의 주요 설정 파일인 my.cnf
을 열어줍니다. 리눅스 기준 /etc/my.cnf
파일을 텍스트 에디터를 사용하여 열어주면 됩니다.
이후 [mysqld]
항목을 찾습니다. 여기의 아랫 부분에 다음과 같은 옵션값을 넣어줍니다.
default_authentication_plugin= mysql_native_password
수정하면 다음과 같을 것입니다.
완료되었다면 파일을 저장하고 빠져나와줍니다.
다음으로 해야 할 것은 현재 사용 중인 사용자 계정의 암호를 모두 바꾸어 주는 것입니다. 관리자 계정을 포함하여 직접 생성한 모든 계정을 미리 찾아둡니다.
먼저 root 계정의 암호를 변경해보도록 하겠습니다. 리눅스에서는 콘솔 환경에서, 윈도우 기준 cmd
에서 명령어를 입력하여 mysql 데이터베이스에 접속합니다.
mysql -uroot -p Enter password: <root 계정의 암호 입력>
이후 다음 쿼리문을 실행합니다. 여기서 주의할 점은 기존에 유저를 생성할 때 입력한 쿼리인 IDENTIFIED BY
가 아닌 IDENTIFIED WITH mysql_native_password
로 입력해주어야 합니다.
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]'; ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';
그 다음으로, 별도로 생성한 일반 사용자가 있다면 해당 사용자에 대한 계정도 아래와 같이 변경해줍니다.
ALTER USER '[사용자명]'@'%' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';
만약 이후에 사용자를 생성하게 될 경우에는 다음과 같이 IDENTIFIED WITH mysql_native_password BY
를 사용해주면 됩니다. 그렇지만 위에서 설정했듯이 기본 값으로 이미 mysql native password를 사용하기 때문에 기존 방식대로 사용자를 생성해도 무방합니다.
암호 변경이 완료되었다면 잠시 데이터베이스 서버의 연결을 끊어주겠습니다. (exit
입력)
이제 MySQL Server의 서비스를 다시 시작해주어야 합니다. 리눅스를 기준으로 다음 명령어로 서비스를 다시 시작해줍니다. (프로그램 및 운영체제에 따라 서비스 이름이 mysqld
이거나 mysql
일 수 있습니다. 이 방법을 모른다면 호스팅 및 서버 관리자에게 문의해보셔야 합니다.)
만약 systemd
를 사용 중이라면 다음과 같이도 사용 가능합니다.
[root@localhost ~]# systemctl restart mysqld.service
MySQL 서버가 재시작되었다면, 다시 한 번 PHP PDO의 접속 코드가 사용 된 페이지에 접속하고 문제가 발생하는지 확인해보세요.
별다른 문제가 없다면 에러 메세지가 사라지고 문제 없이 서버에 연결 되어 있을 것입니다.
감사합니다
도움되어서 다행이네요!
고맙습니다