Ghost 관리자 로그인 “Too many attempts” 해결 방법 (Docker + MySQL 환경)

Ghost 관리자 페이지에 로그인하려고 할 때 아래와 같은 에러가 발생할 수 있다.

Too many attempts. Please try again later.

이 에러는 단순한 로그인 실패가 아니라,
Ghost의 보안 기능(브루트포스 방지)에 의해 로그인 시도가 차단된 상태다.

특히 여러 번 인증코드를 잘못 입력하거나 로그인 실패가 반복되면 발생한다.


📌 문제 원인

Ghost는 로그인 시도 기록을 데이터베이스에 저장한다.
이 기록이 일정 횟수를 넘으면 해당 계정 또는 IP를 잠시 차단한다.

이 정보는 보통 아래 테이블에 저장된다:

  • brute → 로그인 시도 제한 기록
  • sessions → 세션 정보

즉, 이 테이블에 기록이 남아 있으면 계속 차단 상태가 유지된다.


🧱 환경

이 글은 아래 환경 기준으로 작성됨:

  • Docker + docker-compose
  • Ghost + MySQL (MariaDB 포함 가능)
  • DB 볼륨 마운트 사용 (/var/lib/mysql)

🚀 해결 방법

1️⃣ MySQL 컨테이너 접속

먼저 실행 중인 컨테이너 확인:

docker ps

* 만약 자신이 컨테이너 이름을 ghost로 해놓았다면 밑의 명령어를 사용하면 더 가독성이 좋다. 
docker ps | grep ghost 

결과:

본인의 MySQL 컨테이너 이름을 확인한 뒤 접속:

docker exec -it <자신의 MySQL 컨테이너 이름> mysql -u root -p

예시.
docker exec -it ghost-mysql mysql -u root -p
ghost-mysql은 예시이며, docker ps 명령어로 나온 자신의 컨테이너 이름에 맞게 수정해야 한다.

docker exec -it ghost-mysql mysql -u root -p 결과:

root@ubuntu:/docker/ghost/data/mysql# docker exec -it ghost-mysql mysql -u root -p
Enter password: 자신이 설정한 MySQL DB의 root 계정 비밀번호 입력

2️⃣ Ghost 데이터베이스 선택

USE ghost;
USE ghost; 명령어 또한 자신이 docker-compose에 설정해놓은 DB 이름을 사용해야 오류가 발생하지 않는다.

3️⃣ 로그인 제한 기록 삭제

TRUNCATE TABLE brute;

추가로 세션도 초기화:

TRUNCATE TABLE sessions;

실제로 테이블 안의 내용이 비워졌는지 확인:

SELECT * FROM brute;
SELECT * FROM sessions;

4️⃣ Ghost 컨테이너 재시작

docker restart ghost

5️⃣ 다시 로그인

이제 /ghost 관리자 페이지에 다시 접속하면 정상적으로 로그인 가능하다.


🔍 TRUNCATE vs DELETE (짧은 설명)

  • DELETE → 조건으로 일부 삭제 (느림)
  • TRUNCATE → 테이블 전체 데이터 즉시 초기화 (빠름)

여기서는 전체 기록을 지우는 것이 목적이므로 TRUNCATE를 사용한다.


⚠️ 주의사항

  • users 테이블은 절대 건드리지 말 것
  • TRUNCATE는 되돌릴 수 없음
  • 운영 환경에서는 남용 금지

💡 정리

  • “Too many attempts”는 서버 문제가 아니라 DB에 저장된 제한 상태
  • 해결 방법은 간단하다:
    brute 테이블 초기화

😎 한 줄 요약

Ghost 로그인 제한은 DB에 저장된다 → TRUNCATE brute로 즉시 해제 가능