스프링 시큐리티(인증)

반응형
반응형

스프링 시큐리티 (Spring Security)는 스프링 기반 어플리케이션의 보안(인증과 권한, 인가)을 담당하는 스프링 하위 프레임워크.

보안과 관련해서 체계적으로 많은 옵션들을 제공해주기 때문에 개발자의 입장에서는 하나하나 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다.

특징과 구조

  • 보안과 관련하여 체계적으로 많은 옵션을 제공하여 편리하게 사용할 수 있음
  • Filter 기반으로 동작하여 MVC와 분리하여 관리 및 동작
  • 어노테이션을 통한 간단한 설정
  • Spring Security는 기본적으로 세션 & 쿠키 방식으로 인증
  • 인증관리자(Authentication Manager)와 접근 결정 관리자(Access Decision Manager)를 통해 사용자의 리소스 접근을 관리
  • 인증 관리자는 UserNamePasswordAuthenticationFilter, 접근 관리자는 FilterSecurityInterceptor가 수행
  1. http 요청을 받아 filter을 통해 인증절차를 진행 한다.
    1. 필터 기반이므로 디스패치 서블릿 보다 앞단에서 동작한다
  2. 필터를 통해 Authentication 객체를 전달 받을 수 있다.
  3. AuthenticationProvider을 통해 인증 절차를 검증한다.
  4. UserDetailsService를 통해 인증과정에 필요한 추가정보를 제공한다. 그게 UserDetails가 나오는거구
  5. SecurityContext
  • 저장된 인증된 사용자 정보는 주로 권한 검사, 세션 관리, 보안 작업 등에서 사용됩니다. 이를 통해 스프링 시큐리티는 애플리케이션 내에서 사용자가 인증된 상태인지를 체크하고, 사용자의 권한에 따라 접근을 제어하며, 인증 세션을 유지할 수 있습니다.
  • 쓰레드 로컬에 저장합니다.
    • 권한 검사:
      • 애플리케이션의 특정 기능이나 리소스에 접근하기 전에 사용자의 권한을 확인해야 합니다.
      • 예를 들어, "관리자" 권한만 있는 기능에 접근하려면, SecurityContext에서 현재 사용자의 권한을 확인하고, 해당 권한을 가진 사용자인지 여부를 검사합니다.
      Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
      if (authentication != null) {
          Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
          for (GrantedAuthority authority : authorities) {
              if (authority.getAuthority().equals("ROLE_ADMIN")) {
                  // 관리자 권한을 가진 사용자만 접근 가능
                  return true;
              }
          }
      }
      
    • 사용자 인증 상태 추적:
      • SecurityContext를 통해 애플리케이션은 사용자가 인증된 상태인지를 추적합니다. 이를 통해 사용자가 인증된 세션을 가지고 있는지 확인하고, 인증되지 않은 사용자가 접근할 수 없는 리소스에 접근하려 할 때 이를 차단합니다.
      • 예를 들어, 사용자가 로그인하지 않고 보호된 페이지에 접근하려고 하면, 로그인 페이지로 리디렉션할 수 있습니다.
    • 세션 관리:
      • 스프링 시큐리티는 세션을 통해 사용자의 인증 상태를 관리할 수 있습니다. 사용자가 로그인하면 Authentication 객체가 SecurityContextHolder에 저장되고, 이는 세션에 저장될 수 있습니다.
      • 이후 다른 요청에서도 같은 세션 내에서 인증된 사용자 정보가 계속 사용됩니다. 이를 통해 애플리케이션은 사용자가 로그인 상태를 유지할 수 있도록 합니다.
    • 사용자 정보 접근:
      • 애플리케이션 내에서 현재 인증된 사용자에 대한 다양한 정보를 쉽게 가져올 수 있습니다. 예를 들어, 사용자의 이름, 이메일, 권한 등을 어디에서든 손쉽게 조회할 수 있습니다.
      Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
      if (authentication != null) {
          String username = authentication.getName();  // 현재 인증된 사용자 이름
          // 다른 사용자 관련 정보 가져오기
      }
      
    • CSRF 보호:
      • 스프링 시큐리티는 CSRF(Cross-Site Request Forgery) 공격을 방지하기 위해, 사용자의 세션을 관리하고 요청에 대해 토큰을 검증합니다. 이를 통해 사용자의 인증 상태와 요청의 유효성을 검사할 수 있습니다.
    • 스프링 시큐리티의 커스터마이징:
      • SecurityContext를 활용하여 커스터마이징된 보안 로직을 추가할 수 있습니다. 예를 들어, 사용자의 인증 정보가 변경되었을 때 SecurityContext를 업데이트하거나, 사용자가 시스템에서 로그아웃할 때 SecurityContext를 정리할 수 있습니다.
반응형

'국비지원 (스파르타)' 카테고리의 다른 글

ACID vs BASE  (0) 2025.03.07
카프카는 도대체 어떻게 사용하는 걸까?  (2) 2025.03.07
스프링 이벤트  (0) 2025.03.04
DDD와 샤딩(feat.gpt)  (0) 2025.02.28
DDD (시작)  (0) 2025.02.27

댓글

Designed by JB FACTORY