노트

세션 인증

Session-Based Authentication

백엔드#security#http · 연결된 개념 12개

쉽게 말하면

세션 인증은 코트 보관소처럼 서버가 내 로그인 상태를 맡아 두고 나는 번호표만 들고 다니는 방식이에요. 요청마다 번호표를 보여 주면 서버가 보관함에서 누군지 찾아 주니 매번 다시 로그인하지 않아도 돼요.

비유가 깨지는 곳 번호표인 세션 id 쿠키는 브라우저가 요청마다 자동으로 실어 보내서, 남이 꾸민 요청에도 따라가요. 그래서 CSRF 방어가 필요하고, 서버가 여러 대면 Redis 같은 세션 저장소를 공유해야 해요.

서버가 로그인 상태를 저장하고, 브라우저는 세션 id(session identifier)만 쿠키로 들고 다니는 방식. 서버에서 세션을 지우면 즉시 로그아웃되고, 세션 쿠키에 HttpOnly를 붙이면 스크립트로 읽을 수 없다.

  • 서버가 상태를 가지므로 서버를 여러 대로 늘리면 세션 저장소(예: Redis)를 공유해야 한다
  • 쿠키는 요청마다 자동으로 실리므로 CSRF 방어가 필요하다
  • 다른 출처의 프런트에서 쓰면 CORS(Cross-Origin Resource Sharing)의 credentials 설정과 쿠키 SameSite를 함께 맞춘다
  • JWT와 비교하면 취소·보안은 세션이, 서버 확장·서비스 간 전달은 JWT가 편하다
sequenceDiagram
  participant B as 브라우저
  participant S as 서버
  participant R as 세션 저장소
  B->>S: 로그인
  S->>R: 로그인 상태 저장
  S-->>B: 세션 id를 쿠키로 내려줌
  B->>S: 이후 요청마다 세션 id 쿠키
  S->>R: 세션 id로 조회
  R-->>S: 로그인 상태
  S-->>B: 응답

Django에서는

Django도 같은 방식이다. SessionMiddleware가 쿠키의 세션 키로 세션을 불러오고, 로그인 뷰의 login()이 인증된 사용자 ID를 세션에 저장한다. 기본 저장소는 DB의 django_session 테이블이고 캐시(Redis)로 바꿀 수 있다. SESSION_COOKIE_AGE로 만료를 정하고, SESSION_SAVE_EVERY_REQUEST를 켜거나 일정 주기로 세션을 갱신하는 미들웨어를 두면 활동 중인 사용자의 만료가 뒤로 밀린다. 흐름은 Django 미들웨어와 로그인 흐름, CSRF 방어는 Django의 CSRF 방어를 본다.

책: 11장. 다른 길 — 세션

출처: OWASP Session Management Cheat Sheet · Django 문서: Configuring the session engine · When sessions are saved

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • localStorage와 sessionStorage

    브라우저에 문자열 키-값을 저장하는 Web Storage API의 두 가지. 쿠키와 달리 요청에 자동으로 실리지 않고, 출처 단위로 나뉘며(same-origin-policy), 보통 출처당 5MB 안팎을 쓸 수 있다. 동기 API라 큰 데이터를 자주 읽고 쓰면 메인 스레드를 막는다.

  • XSS

    XSS(Cross-Site Scripting)는 공격자가 넣은 스크립트가 내 사이트의 출처(origin) 권한으로 사용자 브라우저에서 실행되는 공격이다. 같은 출처의 코드로 돌기 때문에 same-origin-policy가 막아 주지 못한다. 그 스크립트는 페이지를 바꾸고, 로그인한 사용자 행세를 하며 요청을 보내고, JS가 읽을 수 있는 데이터(localStorage의 토큰 등)를 빼 갈 수 있다.

  • 브라우저 요청과 서버 간 요청

    같은 HTTP 요청이라도 브라우저에서 보내면 여러 보안 규칙이 강제되고, 서버에서 보내면 아무 제한이 없다. 브라우저 보안 정책은 신뢰할 수 없는 코드로부터 사용자를 지키려고 있기 때문이다.

  • 브라우저 캐시

    한 번 받은 리소스(HTML·CSS·JS·이미지)를 브라우저가 저장해 두었다가 다시 쓰는 기능. 서버가 응답 헤더로 얼마나, 어떻게 캐시할지 알려 주고 브라우저가 그대로 따른다.

  • 비밀번호 저장: 인코딩·암호화·해싱

    비밀번호는 원문으로 저장하지 않고, 느린 단방향 해시(one-way hash)로 바꿔 저장한다. 로그인할 때는 입력값을 같은 방식으로 해시해 저장된 값과 비교한다. 인코딩·암호화·해싱은 비슷해 보이지만 목적이 다르다.

보기 옵션