C.W.K.
Stream
Lesson 01 of 06 · published

한 그림으로 보는 아키텍처

~15 min · architecture, schema, middleware

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

PIN layer 는 어떤 웹 프레임워크 뒤에든 들어맞는 작은 self-contained 인증 시스템. trusted perimeter (Tailscale) 안에 per-request 인증을 추가해서, perimeter 가 깨져도 자물쇠가 남아있게 해.

구성요소

컴포넌트하는 일위치
Middleware모든 요청 게이트: bypass / session-check / login redirect웹 프레임워크 요청 파이프라인
SQLite 테이블Config (PIN hash, settings), session, blacklist, retry attempt디스크의 파일 하나
Login 엔드포인트PIN 검증, session 쿠키 발급, 실패 시 retry counter 증가POST /login
Logout 엔드포인트session row 삭제, 쿠키 clearPOST /logout
Admin 엔드포인트session 리스트, blacklist 관리, "Revoke All" killswitch/admin/security/* (Track 8)

스키마 전체

테이블 4개, join 없음, 마이그레이션 필요 없음. 다음 레슨들이 요청이 만지는 순서로 각 컴포넌트 walk through.

Code

Middleware 요청 흐름·text
들어오는 요청
   |
   v
[Middleware]
   |
   |--- public path (login, health, static)? ---> 통과
   |
   |--- source IP 가 LOCAL_BYPASS 리스트? --------> 통과
   |
   |--- source IP 가 blacklist? -----------------> 403 Forbidden
   |
   |--- session 쿠키 있고 valid? ----------------> user attach, 통과
   |
   |--- 그 외 ------------------------------------> /login 으로 redirect
PIN layer 의 SQLite 스키마 전체·sql
-- Config: row 하나, PIN hash 와 정책 보관
CREATE TABLE security_config (
  id              INTEGER PRIMARY KEY CHECK (id = 1),
  pin_hash        TEXT    NOT NULL,
  pin_enabled     INTEGER NOT NULL DEFAULT 1,
  max_retry       INTEGER NOT NULL DEFAULT 5,
  session_seconds INTEGER NOT NULL DEFAULT 2592000   -- 30일
);

-- Active session
CREATE TABLE security_sessions (
  token       TEXT PRIMARY KEY,
  ip          TEXT    NOT NULL,
  created_at  INTEGER NOT NULL,
  expires_at  INTEGER NOT NULL
);

-- IP 별 retry counter
CREATE TABLE security_attempts (
  ip          TEXT PRIMARY KEY,
  fail_count  INTEGER NOT NULL DEFAULT 0,
  updated_at  INTEGER NOT NULL
);

-- IP blacklist
CREATE TABLE security_blacklist (
  ip          TEXT PRIMARY KEY,
  reason      TEXT,
  blocked_at  INTEGER NOT NULL
);

External links

Exercise

security.db 만들고 위의 CREATE TABLE 4개 돌려 (sqlite3 security.db < schema.sql). 플레이스홀더 pin_hash 로 security_config 에 테스트 row insert (실제는 다음 레슨). 운동: SQLite 가 머신에 있고, 테이블 존재, 쿼리 가능 확인.

Progress

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

댓글 0

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

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