MySQL password 대응
MySQL 8에서 사라진 PASSWORD() 함수, 어떻게 대처해야 할까?
MySQL을 5.x 버전대에서 8.0 이상으로 업그레이드한 개발자라면 한 번쯤 마주쳤을 법한 오류가 있습니다. 바로 이전에 잘 사용하던 PASSWORD()
함수가 더 이상 작동하지 않는 문제입니다.
기존에는 아래와 같은 쿼리로 사용자의 비밀번호를 손쉽게 해시하여 저장할 수 있었습니다.
-- MySQL 8.0 이전 버전에서 사용되던 방식
UPDATE user SET password_column = PASSWORD('my_password');
하지만 MySQL 8.0부터 PASSWORD()
함수는 지원 중단(deprecated) 후 제거되었기 때문에, 위 쿼리를 실행하면 오류가 발생합니다.
왜 PASSWORD() 함수가 사라졌을까?
가장 큰 이유는 보안입니다. PASSWORD()
함수는 'mysql_native_password' 인증 방식에 사용되는 해시 값을 생성했는데, 이 해싱 알고리즘은 솔트(salt)를 사용하지 않는 오래된 방식입니다. 최신 보안 표준에 비해 취약점이 존재하여, MySQL 8.0부터는 기본 인증 플러그인이 더 강력한 caching_sha2_password
로 변경되면서 PASSWORD()
함수도 자연스럽게 사라지게 된 것입니다.
임시 해결책: PASSWORD() 함수 직접 구현하기
만약 기존 시스템과의 호환성 문제로 PASSWORD()
함수와 동일한 결과값이 반드시 필요한 상황이라면, 아래와 같이 수동으로 해시 값을 생성할 수 있습니다. 이는 PASSWORD()
함수의 내부 동작을 SQL 함수로 그대로 구현한 것입니다.
UPDATE user
SET password_column = CONCAT('*', UPPER(SHA1(UNHEX(SHA1('my_password')))));
이 쿼리는 다음 단계로 실행됩니다.
- SHA1('my_password'): 비밀번호를 1차로 SHA1 해싱합니다. (결과는 40자리의 16진수 문자열)
- UNHEX(...): 1차 해싱된 16진수 문자열을 다시 바이너리(binary) 값으로 변환합니다.
- SHA1(...): 바이너리로 변환된 값을 다시 2차로 SHA1 해싱합니다.
- UPPER(...): 최종 해시 값을 대문자로 변환합니다.
- CONCAT('*', ...): 결과값 앞에
*
문자를 붙여mysql_native_password
형식의 해시를 완성합니다.
이 방법은 급한 불을 끄는 데는 유용하지만, 근본적인 해결책은 아닙니다. 장기적으로는 더 안전한 방식을 채택하는 것이 좋습니다.
권장되는 현대적인 접근 방식
가장 좋은 방법은 MySQL의 변화에 맞춰 비밀번호 관리 방식을 현대화하는 것입니다.
1. MySQL 사용자 계정 관리
데이터베이스의 공식 사용자(USER) 계정의 비밀번호를 변경할 때는 mysql.user
테이블을 직접 수정하는 대신, 아래와 같이 공식 명령어를 사용하는 것이 안전하고 올바른 방법입니다.
-- 새로운 사용자 생성
CREATE USER 'username'@'localhost' IDENTIFIED BY 'new_password';
-- 기존 사용자 비밀번호 변경
ALTER USER 'username'@'localhost' IDENTIFIED BY 'new_password';
이 명령어들은 현재 설정된 기본 인증 플러그인(예: caching_sha2_password
)을 사용하여 안전하게 비밀번호를 해싱하고 저장합니다.
2. 애플리케이션의 사용자 비밀번호 관리
웹사이트나 애플리케이션의 회원 비밀번호처럼 별도의 테이블에서 비밀번호를 관리하는 경우, PASSWORD()
함수 대신 애플리케이션 언어(Java, Python, PHP 등)에서 제공하는 강력한 해싱 라이브러리를 사용하는 것이 표준입니다.
- Bcrypt, Scrypt, Argon2와 같은 최신 해싱 알고리즘을 사용하세요.
- 이 알고리즘들은 '솔트(Salt)'를 자동으로 추가하고 '키 스트레칭(Key Stretching)' 같은 기술을 적용하여 무차별 대입 공격(Brute-force attack)에 훨씬 안전합니다.
결론
MySQL 8.0으로 업그레이드하면서 PASSWORD()
함수를 더 이상 사용할 수 없게 된 것은 더 나은 보안을 향한 자연스러운 변화입니다.
- 단기적인 해결책이 필요하다면
SHA1(UNHEX(SHA1(...)))
조합으로 기존 해시를 생성할 수 있습니다. - 장기적인 관점에서는
ALTER USER
명령어를 사용하거나, 애플리케이션 레벨에서Bcrypt
와 같은 최신 해싱 알고리즘을 도입하여 시스템의 보안을 강화하는 것이 바람직합니다.
댓글
댓글 쓰기