본문 바로가기

스프링

Spring Security - 스프링 시큐리티 정리

Spring Security란?

Authenitication(인증)과 Authorization(인가)를 제공하는 프레임워크

  • 각 인증, 권한에 대한 부분을 Fiter 흐름에 따라 처리 (필요한 Fiter을 구현하여 사용하는 방식)
  • 인증 절차를 거친 후 인가 절차를 거침
  • Credential 기반의 인증 방식을 사용
Credential ?
Principal을 아이디로 사용 ( Principal : 보호받는 Resource에 접근하는 대상 )
Credential을 비밀번호로 사용 (Credential : Resource에 접근하는 대상의 비밀번호 )

Spring Security의 특징

  1. 서블릿 API 통합
  2. Spring Web MVC와의 선택적 통합
  3. 인증과 권한 부여를 모두 포괄, 확장 가능한 지원
  4. 세션 고정, Clickjacking, 사이트 간 요청 위조 등의 공격으로부터 보호
세션 고정 : 사용자 로그인 시 항상 일정하게 고정된 세션 ID값을 사용하는 취약점
Clickjacking : 사용자가 클릭하고 있다고 인지하거나 다른 어떤 것을 클릭한 거처럼 속이는 악의적 기법
사이트 간 요청 위조(csrf) : 사용자의 의지와 무관하게 공격자가 특정 웹사이트에 요청하게 하는 공격 기법

로그인 인증 구조

  1. 로그인 HTTP  요청
  2. Authentication Filter 가 요청을 받아 UsernamePasswordAuthenticationToken을 만들어서 AuthenticationManager 인터페이스에게 전달
    1. AuthenticationManager가 받은 정보로 Authentication을 생성
    2. 생성한 Authentication이 올바른 Credential 인지 체크
    3. 올바르다 ➡️ 사용자 인증
    4. 체크 실패 ➡️ Authentication Exception 발생
  3. AuthenticationManager가 Authentication 객체를 AuthenticationProvider에게 전달
  4. AuthenticationProvider가 받은 Authentication 객체를 가지고 User 확인 후, UserDetail 인터페이스로 User 세션을 생성
  5.  UserDetail 인터페이스를 SecurityContextHolder에 저장 후, User 세션 아이디를 응답으로 보냄
  6. 이후, 요청이 오면, 요청 쿠키의 Jsession ID를 검증 후 인증

주요 Fitler들

SecurityContextPersistenceFilter

  • SecurityContextRepository를 통해 SecurityContext를 불러오거나 저장

LogoutFilter (로그아웃)

  • 로그아웃 URL로 오는 요청을 감지 후, 로그아웃 처리

UsernamePasswordAuthenticationFilter (로그인)

  • ID/비밀번호 기반 Form 인증 요청 URL을 감지하여 사용자 인증

ExceptionTransiationFilter

  • 요청 중 발생하는 예외를 위임하거나 전달

FilterSecurityInterceptor

  • 접근 권한 확인을 위해 요청을 AccessDecisionManager로 위임
  • 이 필터가 실행되는 시점에 사용자의 인증으로 판단

참고 출처

https://velog.io/@kys95/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0-Authentication

https://docs.spring.io/spring-security/reference/index.html

https://www.youtube.com/watch?v=aEk-7RjBKwQ   🔥 10분 테코톡 시청 추천

https://mangkyu.tistory.com/76