[MSA 과정] DB 연결 오류
강의를 듣다가 생긴 이슈이다..
다른 사람들은 어떤지 모르겠지만 나는 DB에 접속이 안되어 수업중 애를 먹었다.
DB는 이전에 SpringBoot를 배울때 썻던 HeidiSQL을 사용하고 있다.
지난번에 연결이 안되었을 땐 HeidiSQL에 있는 [사용자 인증 및 권한 관리] 에서
user를 추가하고 권한을 주는 식으로 해결을 보았다.
하지만, 왠지 모를 찝찝함이 남아있었다.
root로는 접근이 안되는 부분이였다.
root는 최상위 권한이라고 있었고, 전부 접근이 가능해야 할 텐데
접속이 안되어버리니 답답할 따름이였다.
특히 다른 사람들은 다 되는데 나만 안되는 것 같아 더 그랬던거 같다.
이번에는 제대로 잡고 가야할 것 같아서 될 때까지 해보았다.
일단 강사님와 똑같은 환경을 만들었다.
C:\Server\db 에 post 폴더를 만들어주는 것 부터 시작했다.
(cmd)
post 폴더 생성
mkdir post
C:\Server\db\post 로 이동
cd post
docker-compose.yml 파일을 준비한다.
강사님과 동일한 환경을 만들기 위해서는 이 부분이 중요했다.
version: '3'
services:
mysql:
image: mysql:8.0
container_name: mysql-post
restart: always
ports:
- "13307:3306"
volumes:
- ./data:/var/lib/mysql
environment:
MYSQL_ROOT_PASSWORD: 1234
MYSQL_DATABASE: post
MYSQL_CHARSET: utf8mb4
MYSQL_COLLATION: utf8mb4_unicode_ci
MYSQL_USER: user
MYSQL_PASSWORD: 1234
이번에 post service 프로젝트를 생성할 때
다른 프로젝트와 다른게 있다면
container_name: mysql-post
ports:
- "13307:3306"
MYSQL_DATABASE: post
이 부분들이였다.
이제 docker-compose를 이용해 data폴더를 만들어준다.
( docker desktop 켜져있어야 함 - 이거 때문에 삽질 한 적 있음..)
docker-compose up -d
잘 되었는지 확인
docker-compose ps
일단 문제는 없다.
post service 프로젝트도 구동시켜주고
문제 없이 되었다.
HeidiSQL로 돌아가 세션 설정을 하고 접속을 하는데
root로 접속하면 에러가 발생한다.
user로는 잘 접속이 된다.
docker-compose.yml 파일에
추가.
MySQL은 보안상 root 사용자가 아무데서나 접속하는 것을 막아 놓는다고 한다.
기본 설정 : root@localhost만 허용.
-> root는 오직 같은 서버 ( localhost )에서만 접속 가능
여기서 %는 모든 호스트에서 접속을 허용하는 와일드 카드
localhost : 같은 서버에서만
192.168.% : 192.168.O.O 대역에서만
(cmd)
docker-compose down ( C:\Server\db\post 에서 해야 함. )
data 폴더 강제 삭제. 또는
rmdir /s c:\Server\db\post\data
다시
docker-compose up -d
권한이 적용되었는지 확인
docker exec -it mysql-post mysql -u root -p1234 -h localhost
(mysql)
select user, host from mysql.user;
잘 적용이 된 것 같다.
HeidiSQL 들어가서 다시 확인해보기
잘 되는 모습
만약 여기서 안되는 경우에는
내가 시도해 보았던 방법이 몇 개 있다.
1. 세션 설정에서 라이브러리 : mariadb로 했다가 접속 끊고 mysql로 다시 접속해보기
(이거 은근 잘 됨. 왜 그런지 정확히는 모르겠는데, 이렇게 하면 잘 들어가짐;;;)
2. 포트가 열려있는지 확인해 보기
(cmd)
netstat -an | findstr 13307
포트 상태는 정상인 것을 확인.
3. root 사용자 인증 방식 변경하기
먼저 인증 방식 확인
root로 mysql 접속
docker exec -it mysql-post mysql -u root -p1234 -h localhost
(mysql)
select user, host, plugin from mysql.user where user in ('root','user');
caching_sha2_password
MySQL 8.0의 기본 인증 방식인데, 일부 클라이언트에서는 지원을 안 할 수도 있다고 함!
다시 말하자면,
HeidiSQL과 MySQL 8.0의 기본 인증 방식이 호환성 문제를 일으킬 수 있는 가능성이 있다는 것
root의 사용자 인증 방식을 mysql_native_password 로 변경해보기
alter user 'root'@'%' identified with mysql_native_password by '1234';
설정 적용
flush privileges;
그러고 다시 확인
mysql_native_password 로 변경 된 것 확인.
HeidiSQL에서 잘 되는지 확인하기.
마지막으로 시도 했던 인증 방식 변경은
학습 목적이 아니면 최대한 피하는게 좋을 것 같다..
일단 보안성이 저하되는데 기존은 SHA-256 기반인 반면
native_password는 SHA-1 기반이라서 상대적으로 약하며
미래 호환성 문제도 좋지 않고
성능상으로도 상당히 불리해 진다
: 기존 방식 - 캐싱 기능으로 빠른 재인증, native 방식 - 매번 새로 인증 처리
암호 저장 방식은 기존 방식보다 더 약한 해시 알고리즘을 사용하며,
무차별 대입 공격에 상대적으로 취약하다.
오로지 강의를 듣는 동안 학습과정을 따라가기 위한 꼼수 정도로 보면 될 것 같다.