LG CNS Camp 2기/MSA 과정 : 메모

[MSA 과정] DB 연결 오류

BuSiSi 2025. 6. 4. 00:46

강의를 듣다가 생긴 이슈이다..

 

다른 사람들은 어떤지 모르겠지만 나는 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로 접속하면 에러가 발생한다.

Access denied for user 'root'@'172.19.0.1' (using password: YES)

 


user로는 잘 접속이 된다.

 


docker-compose.yml 파일에 

MYSQL_ROOT_HOST: '%'

 

추가.

 

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 방식 - 매번 새로 인증 처리

 

암호 저장 방식은 기존 방식보다 더 약한 해시 알고리즘을 사용하며,

무차별 대입 공격에 상대적으로 취약하다.

 

오로지 강의를 듣는 동안 학습과정을 따라가기 위한 꼼수 정도로 보면 될 것 같다.