카테고리 없음

[스나이퍼팩토리] 카카오클라우드- CAPTCHA 프로젝트 핵심 개념 학습 회고

mangji2 2025. 8. 10. 23:29

모놀리식에서 마이크로서비스로의 진화 과정

1단계: 빠른 검증 (모놀리식)

  • 모든 기능을 하나의 애플리케이션에 통합
  • 빠른 개발과 배포로 아이디어 검증
  • 팀 규모가 작을 때 효율적

2단계: 서비스 분리 (마이크로서비스)

  • ML 모델 서비스 독립화
  • 각 서비스의 독립적 스케일링
  • 장애 격리와 기술 스택 다양화

3단계: 운영 최적화

  • 서비스 간 통신 최적화
  • 장애 복구 및 폴백 전략
  • 모니터링과 관찰 가능성 확보

서비스 경계 설계 원칙

프론트엔드 위젯: 사용자 행동 수집 + UI 제공 백엔드 API: 비즈니스 로직 + 인증/인가 + 정책 관리 ML 서비스: 모델 추론 + 데이터 전처리 데이터베이스: 상태 관리 + 로깅 + 통계


 프론트엔드 - 사용자 행동의 디지털 지문 수집

인간 행동 패턴의 과학적 분석

마이크로 모션 패턴:

  • 사람은 완벽한 직선을 그을 수 없음
  • 미세한 떨림과 보정이 계속 발생
  • 속도 변화가 자연스럽고 예측 불가능

인지 부하 신호:

  • 어려운 문제일수록 마우스 움직임이 느려짐
  • 고민할 때는 특정 영역에서 호버링
  • 확신이 없을 때는 클릭 전 망설임 패턴

실수와 교정 패턴:

  • 잘못 클릭 후 즉시 수정하는 행동
  • 선택을 번복하는 자연스러운 패턴
  • 완벽주의적 봇과 구별되는 핵심 요소

LocalStorage 전략의 이해

문제 상황 분석:

  • 매 마우스 이동마다 저장 시도
  • 브라우저 I/O 병목 현상 발생
  • 사용자 경험 저하 (버벅거림)

메모리 버퍼링 전략:

  • 실시간 수집은 메모리에만 저장
  • 중요한 시점에만 영구 저장소 사용
  • 브라우저 종료/새로고침 시에만 백업 저장

원자성과 일관성 보장:

  • 부분적 데이터 저장으로 인한 오염 방지
  • 전체 세션 데이터의 무결성 확보
  • 네트워크 오류 시 로컬 백업 활용

React 상태 관리와 생명주기

상태 머신 패턴 적용:

  • 명확한 상태 전환 규칙
  • 예외 상황에 대한 일관된 처리
  • 디버깅과 테스트 용이성 확보

컴포넌트 생명주기 활용:

  • 마운트 시점의 초기 설정
  • 언마운트 시점의 데이터 정리
  • 메모리 누수 방지 전략

 백엔드 - 신뢰할 수 있는 검증

환경변수 관리의 근본 원리

프론트엔드 vs 백엔드의 근본적 차이:

프론트엔드 (빌드 타임 결정):

  • 빌드 과정에서 환경변수가 코드에 직접 삽입
  • 배포된 후에는 변경 불가능
  • 보안상 민감한 정보는 포함할 수 없음
  • 환경별로 별도 빌드 과정 필요

백엔드 (런타임 결정):

  • 서버 시작 시점에 환경변수 로드
  • 재시작 없이도 설정 변경 가능 (경우에 따라)
  • 민감한 정보도 안전하게 관리 가능
  • 동적 구성 관리 시스템과 연동 가능

JWT와 사용자 인증의 심층 이해

JWT 구조의 보안 원리:

  • Header: 암호화 알고리즘 정보
  • Payload: 실제 사용자 정보 (Base64 인코딩)
  • Signature: 위변조 방지를 위한 서명

토큰 기반 인증의 장점:

  • 서버 상태 없음 (Stateless)
  • 분산 시스템에 적합
  • 클라이언트 측 저장으로 서버 부하 감소

보안 고려사항:

  • 토큰 탈취 시 대응 방안
  • 적절한 만료 시간 설정
  • Refresh Token을 통한 보안 강화

OAuth2 스타일 검증 플로우

B2B 서비스에서의 신뢰 체계:

  • 고객사와 서비스 간 안전한 통신
  • API 키 관리와 권한 부여
  • 콜백 URL을 통한 결과 전달

단발성 토큰의 중요성:

  • 재사용 공격 (Replay Attack) 방지
  • 짧은 수명으로 노출 리스크 최소화
  • 명확한 사용 용도와 권한 범위

ML 파이프라인 - 패턴 인식의 과학

행동 기반 봇 탐지의 특징 엔지니어링

물리적 제약 기반 특징:

  • 인간의 손목/팔 관절 움직임의 물리적 한계
  • 마우스 센서 해상도와 노이즈 특성
  • 반응 시간의 생리학적 한계

인지적 부하 기반 특징:

  • 복잡한 문제일수록 증가하는 처리 시간
  • 주의 분산에 따른 움직임 패턴 변화
  • 스트레스 상황에서의 행동 변화

학습된 행동 패턴:

  • 개인별 고유한 마우스 사용 습관
  • 문화권별 UI 인터랙션 패턴
  • 연령대별 기술 숙련도 차이

CRNN + CTC 손글씨 인식의 핵심 개념

CRNN 아키텍처의 설계 철학:

  • CNN 부분: 이미지에서 지역적 특징 추출
  • RNN 부분: 시계열 패턴과 문맥 이해
  • CTC 부분: 정렬 없는 시퀀스 학습

CTC Loss의 혁신적 아이디어:

  • 기존: 각 픽셀이 어떤 문자인지 정확히 알아야 함
  • CTC: 전체 문장만 맞으면 됨, 위치는 자동 학습
  • 가능한 모든 정렬 경우의 수를 확률적으로 고려

Blank Token의 역할:

  • 문자 사이의 경계 모호성 해결
  • 연속된 같은 문자 구분
  • 길이가 다른 입출력 매핑 가능

손글씨 데이터셋 구축 전략

폰트 기반 합성 데이터 생성:

다양한 폰트 수집:

  • 필기체, 인쇄체, 장식체 등 다양한 스타일
  • 언어별 특성을 반영한 폰트 선택
  • 저작권 문제 없는 오픈 소스 폰트 활용

단어 리스트 조합 전략:

  • 일상 단어: 높은 빈도의 실용적 단어들
  • 도메인 특화 단어: 특정 분야의 전문 용어
  • 난이도별 분류: 쉬운 단어부터 복잡한 문장까지

데이터 증강 (Data Augmentation) 기법:

기하학적 변환:

  • 회전, 기울임, 스케일링으로 다양한 각도 생성
  • 원근 변환으로 카메라 촬영 효과 시뮬레이션
  • 탄성 변형으로 자연스러운 필기 효과

노이즈와 왜곡:

  • 가우시안 노이즈로 실제 스캔 환경 모방
  • 블러 효과로 초점 문제 시뮬레이션
  • 조명 변화와 그림자 효과 추가

배경과 텍스처:

  • 다양한 종이 텍스처 합성
  • 실제 문서의 배경 패턴 활용
  • 얼룩이나 구겨짐 효과 추가

Character Set (Charset) 설계

문자 집합 정의의 중요성:

  • 모델이 인식할 수 있는 문자의 범위 결정
  • 언어별, 용도별 최적화된 집합 구성
  • 특수문자와 기호의 포함 여부 결정

인덱스 매핑 시스템:

  • 문자를 숫자로, 숫자를 문자로 변환
  • 모델 훈련과 추론에서의 일관성 보장
  • 새로운 문자 추가 시 호환성 고려

이번 작업을 통해 아키텍처 설계의 단계적 진화가 왜 중요한지, 특히 모놀리식에서 마이크로서비스로의 전환이 단순 구조 변경이 아니라 운영 효율·확장성·보안성을 동시에 높이는 전략임을 깨달았다.
또한, 사용자 행동 패턴의 과학적 분석이 단순 데이터 수집이 아니라, 인간 특유의 미세한 움직임과 인지 부하 신호를 활용해 봇을 정밀하게 구분하는 핵심 요소임을 이해했다.
백엔드와 프론트엔드 환경변수 처리의 차이, JWT 기반 인증과 OAuth2 플로우의 보안 원리, ML 파이프라인에서 CRNN+CTC의 구조적 강점까지 연결해 보니, 단일 기능 구현이 아니라 엔드 투 엔드 보안·인식 시스템 설계라는 그림이 보였다.
앞으로 남은 기간 동안은 성능 지표 향상과 파이프라인 고도화에 집중하여 모델의 정확도와 안정성을 끌어올리고싶다.
이를 통해 우리 서비스의 보안성을 강화하고, 실사용 환경에서도 신뢰할 수 있는 수준의 방어 능력을 확보하는것이 최종 목표이다.