Merge branch 'main' of https://git.ro-being.com/ivada_Ro-being/DOCS
This commit is contained in:
commit
ba71712648
@ -0,0 +1,151 @@
|
||||
# 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 모드 비활성화
|
||||
```python
|
||||
# docker-compose.yml
|
||||
environment:
|
||||
- HEADLESS_BROWSER=false
|
||||
```
|
||||
- 실제 브라우저 UI를 표시하여 reCAPTCHA 우회
|
||||
- 단점: 서버 환경에서는 사용 불가
|
||||
|
||||
### 1-1. 서버 환경 해결책 - Xvfb (가상 디스플레이)
|
||||
```dockerfile
|
||||
# Dockerfile에 추가
|
||||
RUN apt-get update && apt-get install -y \
|
||||
xvfb \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
```
|
||||
|
||||
```yaml
|
||||
# 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 스크립트 적용
|
||||
```python
|
||||
# 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 사용 가능성 조사
|
||||
- 또는 수동 로그인 후 세션 쿠키 재사용
|
||||
|
||||
## 해결 결과
|
||||
|
||||
### Xvfb 적용 후 성공 로그 (2025-09-18 14:17-14:19)
|
||||
```
|
||||
14:17:53 - 로그인 버튼 클릭
|
||||
14:18:08 - 현재 URL: https://account.squarespace.com/
|
||||
14:18:08 - 페이지 제목: Squarespace — Account Dashboard
|
||||
14:18:13 - ✅ Squarespace 로그인 성공 - Account Dashboard 도달
|
||||
14:18:46 - 뉴스 편집 모드 진입 성공
|
||||
14:18:53 - 섹션 복제 완료
|
||||
14:19:05 - 썸네일 교체 및 링크 수정 완료
|
||||
14:19:17 - 텍스트 편집 완료
|
||||
14:19:17 - Save 버튼 클릭 성공
|
||||
```
|
||||
|
||||
**성공 요인:**
|
||||
- Xvfb로 가상 디스플레이 생성 (DISPLAY=:99)
|
||||
- HEADLESS_BROWSER=false로 실제 Chrome 브라우저 실행
|
||||
- reCAPTCHA가 실제 브라우저로 인식하여 차단하지 않음
|
||||
|
||||
## 교훈
|
||||
1. **자동화 탐지 기술의 발전**
|
||||
- 최신 웹사이트들은 정교한 봇 탐지 시스템 사용
|
||||
- Headless 브라우저만으로는 한계 존재
|
||||
|
||||
2. **에러 메시지 신뢰 불가**
|
||||
- "패스워드 오류"가 실제 패스워드 문제가 아닐 수 있음
|
||||
- 보안 시스템의 의도적인 오도 가능성 고려
|
||||
|
||||
3. **외부 라이브러리 의존성 주의**
|
||||
- playwright-stealth처럼 유지보수 중단된 라이브러리 주의
|
||||
- 핵심 기능은 공식 API 사용 권장
|
||||
|
||||
## 참고 자료
|
||||
- [Playwright 공식 문서 - add_init_script](https://playwright.dev/python/docs/api/class-page#page-add-init-script)
|
||||
- [reCAPTCHA v3 작동 방식](https://developers.google.com/recaptcha/docs/v3)
|
||||
- [Puppeteer Extra Plugin Stealth](https://github.com/berstend/puppeteer-extra/tree/master/packages/puppeteer-extra-plugin-stealth)
|
||||
Loading…
x
Reference in New Issue
Block a user