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

Perimeter vs Per-Request Auth

~15 min · middleware, perimeter, defense-in-depth

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

auth 체크가 어디서 일어나? 두 아키텍처 패턴 — 뭔가 잘못됐을 때 blast radius 가 와일드하게 달라.

패턴체크 위치장점단점
Perimeter네트워크/프록시 layer (VPN, firewall, reverse proxy)앱이 auth 알 필요 없음한 layer = 한 실수로 전체 노출
Per-request각 앱 안 (middleware, route decorator)defense in depth; 한 라우트 우회해도 다른 라우트 우회 안 됨로직 반복, 새 엔드포인트에 잊기 쉬움

솔로 개발자 현실: 둘 다, layered

이게 "값싼 자물쇠 두 개" 모델의 이유 전부:

  • Tailscale = perimeter — tailnet 안 디바이스만 host 도달 가능. (Track 4)
  • PIN middleware = per-request — tailnet 안 디바이스도 non-public 엔드포인트 치려면 session 쿠키 필요. (Track 5)

per-request auth 어디 둘지

FastAPI, Express, Flask, 어떤 모던 웹 프레임워크든: middleware, route 별 체크 X. middleware 는 모든 요청이 핸들러 도달 전에 돌아 — 새 라우트에 추가 잊을 수 없어.

Code

FastAPI middleware 스케치 — 풀버전은 Track 5·python
class PinAuthMiddleware:
    PUBLIC = {"/login", "/health", "/static"}

    async def __call__(self, request, call_next):
        path = request.url.path
        if any(path.startswith(p) for p in self.PUBLIC):
            return await call_next(request)
        if request.client.host in LOCAL_IPS:    # opt-in bypass
            return await call_next(request)
        token = request.cookies.get("session")
        if not token or not is_valid_session(token, request.client.host):
            return RedirectResponse("/login")
        return await call_next(request)

External links

Exercise

네 앱 중 하나에서 라우트 세. 명시적 auth decorator 있는 라우트 세. 비율이 middleware-first 인지 decorator-first 인지 알려줘. decorator 가 지배하면 모든 걸 기본 보호하는 middleware 작성하고 public 라우트는 opt out 시켜 — 편향을 뒤집어.

Progress

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

댓글 0

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

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