JooTC
mysql-mycnf-configuration-user-authentication

[PHP] PDO caching_sha2_password 접속 문제 해결하기

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

수정하면 다음과 같을 것입니다.

mysql-mycnf-configuration-user-authentication

 

완료되었다면 파일을 저장하고 빠져나와줍니다.

다음으로 해야 할 것은 현재 사용 중인 사용자 계정의 암호를 모두 바꾸어 주는 것입니다. 관리자 계정을 포함하여 직접 생성한 모든 계정을 미리 찾아둡니다.

먼저 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를 사용하기 때문에 기존 방식대로 사용자를 생성해도 무방합니다.

CREATE USER '[사용자명]'@'localhost' IDENTIFIED WITH mysql_native_password BY '[변경할 암호]';

 

암호 변경이 완료되었다면 잠시 데이터베이스 서버의 연결을 끊어주겠습니다. (exit 입력)

이제 MySQL Server의 서비스를 다시 시작해주어야 합니다. 리눅스를 기준으로 다음 명령어로 서비스를 다시 시작해줍니다. (프로그램 및 운영체제에 따라 서비스 이름이 mysqld 이거나 mysql 일 수 있습니다. 이 방법을 모른다면 호스팅 및 서버 관리자에게 문의해보셔야 합니다.)

[root@localhost ~]# service mysqld restart

 

만약 systemd를 사용 중이라면 다음과 같이도 사용 가능합니다.

[root@localhost ~]# systemctl restart mysqld.service

MySQL 서버가 재시작되었다면, 다시 한 번 PHP PDO의 접속 코드가 사용 된 페이지에 접속하고 문제가 발생하는지 확인해보세요.

별다른 문제가 없다면 에러 메세지가 사라지고 문제 없이 서버에 연결 되어 있을 것입니다.

구독
알림
guest

3 Comments
Inline Feedbacks
모든 댓글 보기
파랑이유튜브
파랑이유튜브
4 년 전에

감사합니다

ㅇㅇ
ㅇㅇ
3 년 전에

고맙습니다

3
0
이 포스트에 대한 의견을 남겨주세요!x