DOCS/troubleshooting/250918_claude_skill-publish_reCAPTCHA_login_failure.md
Claude-51124 93871d5add docs: Xvfb를 사용한 서버 환경 해결책 추가
- 가상 디스플레이(Xvfb)를 사용하여 서버에서 GUI 브라우저 실행
- HEADLESS_BROWSER=false와 함께 사용하여 reCAPTCHA 우회
2025-09-18 23:02:39 +09:00

4.5 KiB

Skill-Publish Squarespace 로그인 실패 문제

작성일

2025-09-18

작성자

claude

문제 상황

skill-publish 서비스가 Squarespace에 자동 로그인을 시도할 때 지속적으로 실패하는 문제 발생.

증상

  1. 로그인 버튼 클릭 후 페이지 전환 없음
  2. OAuth 리다이렉션 페이지에서 멈춤
  3. 로그: "CAPTCHA 감지됨!"
  4. 실제로는 "The username or password is incorrect" 에러 표시

로그 분석

13:33:04 - 이메일 입력: sig***
13:33:04 - 패스워드 입력
13:33:05 - 로그인 버튼 클릭
13:33:05 - OAuth 리다이렉션 페이지 상태 확인을 위해 15초 대기...
13:33:20 - 현재 URL: https://login.squarespace.com/api/1/login/oauth/provider/authorize?...
13:33:20 - CAPTCHA 감지됨!
13:33:55 - Account Dashboard 대기 시간 초과

원인 분석

근본 원인: reCAPTCHA v3 차단

Squarespace 로그인 페이지 하단에 "Secure Login with reCAPTCHA subject to Google Terms & Privacy" 문구 확인.

상세 분석

  1. reCAPTCHA가 Headless 브라우저를 봇으로 감지

    • Playwright의 Headless 모드는 일반 브라우저와 다른 특징들을 가짐
    • navigator.webdriver 속성 등으로 자동화 도구 감지
  2. 보안 메시지 위장

    • reCAPTCHA는 봇 감지 시 "CAPTCHA 실패"라고 직접 알리지 않음
    • 대신 "아이디/패스워드 오류" 메시지로 위장
    • 봇에게 탐지 사실을 숨기기 위한 보안 전략
  3. 코드의 잘못된 CAPTCHA 감지

    • 코드: if await page.locator('text=/captcha/i').count() > 0
    • 페이지 하단의 "reCAPTCHA" 안내 문구를 CAPTCHA로 오인
    • 실제 CAPTCHA 챌린지는 없음

시도한 해결책

1. playwright-stealth 라이브러리 (실패)

  • pyproject.toml에 추가하고 stealth_async 적용
  • 문제: 최신 버전이 stealth_async 함수를 제공하지 않음
  • 라이브러리가 2023년 3월 이후 업데이트 중단 (unmaintained)

2. 환경변수 확인

  • .env 파일의 따옴표 처리 확인
  • Docker Compose가 자동으로 따옴표 제거
  • 결과: 환경변수는 정상적으로 읽힘

해결 방안

1. 단기 해결책 - Headless 모드 비활성화

# docker-compose.yml
environment:
  - HEADLESS_BROWSER=false
  • 실제 브라우저 UI를 표시하여 reCAPTCHA 우회
  • 단점: 서버 환경에서는 사용 불가

1-1. 서버 환경 해결책 - Xvfb (가상 디스플레이)

# Dockerfile에 추가
RUN apt-get update && apt-get install -y \
    xvfb \
    && rm -rf /var/lib/apt/lists/*
# docker-compose.yml 수정
command: xvfb-run python -m uvicorn app.main:app --host 0.0.0.0 --port 8511
environment:
  - HEADLESS_BROWSER=false  # 실제 브라우저 사용
  • Xvfb(X Virtual Framebuffer): 가상 디스플레이 서버
  • 서버 환경에서 GUI 애플리케이션을 메모리상 가상 화면에서 실행
  • 실제 Chrome 브라우저가 가상 디스플레이에서 실행되어 reCAPTCHA 우회
  • 장점: 서버 환경에서도 GUI 브라우저 실행 가능

2. 중기 해결책 - 수동 Stealth 스크립트 적용

# publisher_service.py에 추가
stealth_script = """
    Object.defineProperty(navigator, 'webdriver', {
        get: () => undefined,
    });
    Object.defineProperty(navigator, 'languages', {
        get: () => ['ko-KR', 'ko'],
    });
    Object.defineProperty(navigator, 'plugins', {
        get: () => [1, 2, 3, 4, 5],
    });
"""

# 브라우저 페이지 생성 후
await page.add_init_script(stealth_script)

3. 장기 해결책 - API 기반 접근

  • Squarespace API 사용 가능성 조사
  • 또는 수동 로그인 후 세션 쿠키 재사용

교훈

  1. 자동화 탐지 기술의 발전

    • 최신 웹사이트들은 정교한 봇 탐지 시스템 사용
    • Headless 브라우저만으로는 한계 존재
  2. 에러 메시지 신뢰 불가

    • "패스워드 오류"가 실제 패스워드 문제가 아닐 수 있음
    • 보안 시스템의 의도적인 오도 가능성 고려
  3. 외부 라이브러리 의존성 주의

    • playwright-stealth처럼 유지보수 중단된 라이브러리 주의
    • 핵심 기능은 공식 API 사용 권장

참고 자료