C.W.K.
Stream
Lesson 04 of 05 · published

최근 시도 로그 — 패턴 spotting

~15 min · attempts-log, logging, patterns

Level 0Greenhorn
0 XP0/53 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

시도 로그가 post-incident 읽을거리이자 매주 건강 체크. 목표는 모든 row 읽는 거 아니라 — 패턴을 한눈에 보이게 하는 거.

display

마지막 100 row, 최신 먼저, 성공/실패 색 코딩. 그게 다.

주시할 패턴

  • 한 IP 의 burst 후 침묵 — retry limit 도달, blacklist 됨. 의도대로 작동.
  • 많은 IP 에서 꾸준한 drip — 분산 스캐너. WAF / fail2ban / 포트 변경 조사.
  • curl / python-requests / wget UA — 100% 봇. 진짜 트래픽은 브라우저.
  • 모르는 IP 에서 성공 로그인 — 이 대시보드 그만 읽고 TRACK 7 으로 가.

보존

SQLite 가 수백만 row 처리 가능, 근데 UI 는 100 visible 넘으면 무용. DB 에 모든 row 유지 (싼 forensic), 기본 마지막 100 display, 파야 할 때 위해 "500개 더 로드" 버튼.

Code

security_attempts 테이블을 full audit 필드로 augment·sql
-- lightweight counter 테이블을 더 풍부한 로그로 교체
CREATE TABLE security_attempts (
  id            INTEGER PRIMARY KEY AUTOINCREMENT,
  ip            TEXT    NOT NULL,
  success       INTEGER NOT NULL,        -- 0 또는 1
  attempted_at  INTEGER NOT NULL,        -- unix timestamp
  user_agent    TEXT,                    -- 선택이지만 유용
  reason        TEXT                     -- 'wrong_pin', 'blacklisted', 'rate_limited', 'success'
);
CREATE INDEX idx_attempts_time ON security_attempts(attempted_at);
CREATE INDEX idx_attempts_ip   ON security_attempts(ip);

External links

Exercise

Simple counter 에서 더 풍부한 시도 로그로 마이그레이션 (위 스키마). increment_attempt 를 counter 증가 대신 새 row 삽입으로 업데이트, attempt_count(ip) 를 '지난 N초의 실패 카운트' 로 재정의. 로그를 대시보드에 렌더. 이제 각 시도가 *왜* 거부됐는지 보여 — 단지 몇 개가 아니라.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.