Post

04 Spring Security

04 Spring Security

1. Spring Filter/interceptor

1. Servlet Filter

  • 위치: 디스패처서블릿 이전 (가장 앞단)
  • 범위: 스프링 MVC 유무 상관없이, 서블릿 레벨에서 모든 요청/응답을 가로챔
  • 주요 역할
    • 인증(Authentication) / 인가(Authorization) → 스프링 시큐리티가 여기에 구현
    • 로깅, 인코딩, CORS 처리
  • 특징: 자바 EE 표준, DispatcherServlet 몰라도 동작 가능

2. 스프링 인터셉터 (HandlerInterceptor)

  • 위치: 디스패처서블릿 이후, 컨트롤러 직전에 동작
  • 범위: 스프링 MVC가 관리하는 요청만 가로챔 (RestController, Controller 등)
  • 주요 역할
    • 컨트롤러로 들어가기 전 공통 로직 (예: 특정 로그 기록, 사용자 요청 파라미터 가공)
    • 응답 가공, 뷰 렌더링 전후 로직
  • 특징: 스프링 MVC에 종속적, MVC 없으면 동작 안 함

3. 스프링 시큐리티(Spring Security)

  • 구현 방식: 여러 개의 필터 체인(Filter Chain) 으로 동작
  • 위치: 디스패처서블릿 이전, 필터 단계에서 실행
  • 주요 역할
    • 로그인 처리 (아이디/비번 검증)
    • 세션/토큰 기반 사용자 인증
    • 권한 체크 후, 컨트롤러로 요청 넘길지 차단할지 결정
  • 특징: 결국 필터를 확장해서 만든 보안 전문 프레임워크

4. NOTE

1. 필터(Filter)

  • 필터라는 단일 개념이 있고,
  • 그 안에 스프링이 제공하는 특화된 필터 모음(스프링 시큐리티),
  • 추가로 개발자가 직접 구현한 사용자 필터

2. 스프링 시큐리티 - 인증 (Authentication)

1. 로그인 처리

| 방식 | 설명 | 예시 | | ——————— | ———————————— | —————————– | | 폼 로그인(Form Login) | HTML 로그인 폼에 아이디/비밀번호 입력 → 서버에서 인증 처리 | 커스텀 로그인 페이지, 로그인 성공/실패 URL 지정 | | HTTP Basic 인증 | HTTP 헤더에 아이디/비밀번호를 Base64 인코딩하여 전달 | REST API 인증 | | Digest 인증 | 해시값을 이용한 인증 방식으로, Basic 인증보다 보안 강화 | 레거시 시스템 인증 | | Remember-me 로그인 | 쿠키 기반 로그인 유지 | 브라우저 재방문 시 자동 로그인 |

  • 로그인 관련 기능 제공

    제공 기능설명
    기본 로그인 페이지스프링 시큐리티가 자동 생성하는 로그인 폼 페이지(/login)
    로그인 처리 URL기본 /login URL에서 POST 요청을 처리
    아이디/비밀번호 파라미터 기본값username, password
    로그인 성공 시 이동 URL기본 / (홈) 페이지
    로그인 실패 시 이동 URL기본 /login?error
    로그아웃 URL기본 /logout
    로그아웃 성공 시 이동 URL기본 /login?logout
    Remember-me 기능선택 시 쿠키를 통한 자동 로그인 가능 (별도 설정 필요)

2. 세션 관리

| 기능 | 설명 | 예시 | | —————————————– | ————————– | ————— | | 세션 고정 보호(Session Fixation Protection) | 로그인 시 세션 ID 재발급으로 세션 탈취 방지 | 스프링 시큐리티 기본 활성화 | | 동시 세션 제어 | 동일 계정으로 여러 세션 제한 | 최대 세션 수 설정 | | 세션 만료 처리 | 일정 시간 비활성 시 세션 자동 종료 | Timeout 설정 |

3. 다양한 인증 제공자

| 방식 | 설명 | 예시 | | ——————————- | ————— | —————- | | In-memory 사용자 저장소 | 메모리에 사용자 계정 저장 | 개발/테스트 용 | | JDBC 기반 사용자 저장소 | DB에 사용자 계정 저장 | MySQL, Oracle 등 | | LDAP 인증 | LDAP 서버로 사용자 인증 | Active Directory | | OAuth2 / OpenID Connect 로그인 | 소셜 로그인 지원 | 구글, 네이버, 카카오 로그인 |

2. 스프링 시큐리티 - 인가 (Authorization)

| 인가 유형 | 구현 방식(스프링 시큐리티 예시) | 설명 | 예시 | | —————- | ———————– | ————————————- | ————————————————————————————————————————— | | 접근 제어 | URL 접근 제어 | 특정 URL 패턴에 권한 매핑하여 접근을 제어 | /admin/ROLE_ADMIN | | 권한 기반 접근 제어 | 역할(Role) 단위 권한 체크 | 사용자에게 부여된 역할에 따라 접근 제어 | .hasRole("USER"), .hasAuthority("ROLE_ADMIN") | | 애노테이션에 의한 인가 | 메소드 레벨 보안, 표현식 기반 권한 제어 | 서비스 계층 메소드 접근을 애노테이션으로 제어, SpEL 사용 가능 | @PreAuthorize("hasRole('ADMIN') and #id == principal.id")
@PostAuthorize("returnObject.owner == principal.username") |

3. 스프링 시큐리티 - 보안 유틸리티

  • CSRF 보호 (기본 활성화) : 공격자가 인증된 사용자의 권한을 이용해 의도하지 않은 요청을 서버에 보내는 공격 방지
  • CORS 지원 : 브라우저가 다른 출처(origin)의 리소스 요청을 허용할지 여부를 제어하는 메커니즘
  • 패스워드 암호화 (BCrypt, SCrypt 등)
  • 보안 헤더 자동 추가

    헤더목적동작예시 값
    X-Frame-Options클릭재킹 방지페이지가 <iframe>에 로드되는 것을 제어DENY, SAMEORIGIN, ALLOW-FROM https://example.com
    X-Content-Type-OptionsMIME 타입 스니핑 방지브라우저가 Content-Type 헤더에 지정된 타입대로만 처리하도록 강제nosniff
    HSTS (HTTP Strict Transport Security)HTTPS 강제브라우저에 HTTPS만 사용하도록 지시Strict-Transport-Security: max-age=31536000; includeSubDomains
    CSP (Content Security Policy)XSS 방지 및 리소스 출처 제한허용된 출처의 리소스만 로드Content-Security-Policy: script-src 'self' https://apis.google.com
  • 예외 처리
    • 인증 실패 → 로그인 페이지 리다이렉트 / 401
    • 인가 실패 → Access Denied 페이지 / 403
This post is licensed under CC BY 4.0 by the author.