본문 바로가기
C.W.K.
Stream
Lesson 04 of 05 · published

최근 시도 로그 — 패턴 읽어내기

~15 min · attempts-log, logging, patterns

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

시도 로그는 사고 후에 읽는 자료이자 매주 하는 건강 검진이야. 모든 줄을 다 읽는 게 목표가 아니라, 패턴이 한눈에 보이게 만드는 게 목표고.

display

최근 100줄, 최신이 위로, 성공과 실패는 색으로 구분. 그게 다야.

주시할 패턴

  • 한 IP 에서 몰아치다가 조용해짐 — retry limit 에 걸려 blacklist 된 거야. 설계대로 돌아간 거지.
  • 여러 IP 에서 꾸준히 조금씩 — 분산 스캐너야. WAF / fail2ban / 포트 변경을 알아봐.
  • curl / python-requests / wget UA — 백이면 백 봇이야. 진짜 트래픽은 브라우저에서 와.
  • 모르는 IP 에서 로그인 성공 — 대시보드 그만 보고 당장 TRACK 7 으로 가.

보존

SQLite 는 수백만 줄도 감당하는데, UI 는 100줄을 넘어가면 쓸모가 없어져. 줄은 DB 에 다 남겨두고 (싸게 얻는 forensic 이야), 기본으로는 최근 100줄만 보여주고, 더 파야 할 때를 위해 "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

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

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