java.sql.SQLInvalidAuthorizationSpecException: Could not connect to address=~

Yushin·2024년 2월 25일
0

트러블슈팅

목록 보기
7/9

상황

EC2에서 작성한 스크립트를 통해 스프링부트 jar 파일을 실행하던 도중 발생하였다.

오류 메세지

java.sql.SQLInvalidAuthorizationSpecException: Could not connect to address=(host=springboot-aws-study.c9wyk4oyy2xa.ap-northeast-2.rds.amazonaws.com)(port=3306)(type=master) : (conn=14677) Access denied for user 'sa'@'172.31.10.124' (using password: YES)

원인

오류 메시지를 해석해보면 권한 오류로 접근이 거부되었다고 한다.
MySQL, MariaDB는 기본적으로 로컬에서만 접근이 가능하도록 설정돼있어 외부에서 접근하기 위해서는 사용자에게 권한을 부여해주어야 한다.

해결

EC2 서버에서 사용하는 application-real-db.properties 파일에 지정된 username 계정에 권한을 부여해야 한다.

application-real-db.properties

spring.jpa.hibernate.ddl-auto=none
spring.datasource.hikari.jdbc-url=jdbc:mariadb://[rds 엔드포인트 주소]:[포트, 기본은 3306]/[db 스키마명]
spring.datasource.username=[db계정]
spring.datasource.password=[db계정 비밀번호]
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver     

username 은 db 생성 시 지정한 master 이름과 같다.
mysql workbench 에서 RDS에 접속 후 Schema 메뉴가 아닌 [Administration > Users and Privileges] 메뉴에 들어가면 현재 등록된 사용자들을 확인할 수 있다.

나는 계정명이 yushinc 이므로 [yushinc 계정 선택 > schema privileges] 를 확인하면 현재 아무런 권한이 부여되어 있지 않아 비어있는 것을 확인할 수 있다.


아래의 코드를 통해 권한을 부여할 수 있다.

create user '[db 계정명]'@'%' identified by '[비밀번호]';
grant all privileges on [db 스키마명].* to '[db 계정명]'@'%';
flush privileges;

쿼리 실행 후 다시 [yushinc 계정 선택 > schema privileges] 를 확인하면 권한이 부여된 것을 볼 수 있다.

결과

권한 부여 후 스크립트를 재실행하면 성공적으로 서버가 실행된다.


** 나는 데이터베이스 생성 시 지정한 master 계정에 권한을 부여하여도 해결되지 않아 오류 메세지에 거부된 계정인 sa 계정을 생성하여 권한을 부여했더니 해결되었다.

** sa 계정은 기본 시스템 계정으로 DB에 대한 모든 권한을 가지고 있다. 비밀번호가 유출되면 큰 문제가 발생할 수 있으므로 되도록이면 사용을 권장하지 않는다고 한다. (근데 나는 미리 생성된 sa 계정이 없었고 권한도 부여된 것이 없었다.. 뭐지)


참고 레퍼런스
https://nonaninona.tistory.com/58
https://sagittariusof85s.tistory.com/20

0개의 댓글