프레임워크/Spring Boot

스프링 시큐리티(spring security)

빨대도둑 2023. 8. 29. 20:15

스프링 시큐리티는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당한느 스프링 하위 프레임 워크 입니다.

인증(authentication)

인증은 사용자의 신원을 입증하는 과정입니다.

예를 들어서 사용자가 사이트에 로그인을 할 때 누구인지 확인하는 과정을 인증이라고 합니다.

인가(authorization)

인가는 사이트의 특정 부분에 접근할 수 있는지에 권한을 확인하는 작업입니다.

예를 들어서 관리자는 페이지에 들어갈 수 있지만, 일반 사용자는 관리자 페이지에 들어갈 수 없습니다.

이런 권한을 확인하는 과정을 ‘인가’ 라고 합니다.

*스프링 시큐리티에서 사용자의 인증, 인가 정보를 UserDetails 객체에 담습니다. 이 클래스를 상속받은 뒤 메서드를 오버라이드해서 사용하면 됩니다.

*스프링 시큐리티에서 사용자의 정보를 가져오는 데 사용하는 UserDetailService를 사용합니다.

*UserDetailService를 상속받은 뒤 loadUserByUsername()를 오버라이드하면 스프링 시큐리티에서 사용자의 정보를 가져올 때 오버라이드 된 메서드를 사용할 수 있습니다.

스프링 시큐리티

스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크 입니다.

보안 관련 옵션을 제공합니다. 또한 애너테이션으로 설정도 쉽습니다.

CSRF 공격, 세션 고정 공격을 방어해주고, 요청 헤더도 보안 처리를 해주므로 개발자가 보안 관련 개발을 해야 하는 부담을 크게 줄여줍니다.

*CSRF 공격은 사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공격입니다.

*세션 고정 공격은 사용자의 인증 정보를 탈취하거나 변조하는 공격입니다.

 

필터 기반으로 동작하는 스프링 시큐리티

 

스프링 시큐리티는 다양한 필터들로 나눠져 있으며, 각 필터에서 인증, 인가와 관련된 작업을 처리합니다.

SecurityContextPersistenceFilter 부터 시작해서 아래로 내려가면서 FilterSecurityInterceptor까지 순서대로 필터를 거칩니다.

가장 대중적으로 사용하는 필터는

UsernamePasswordAuthenticationFilter: 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할을 합니다.

FilterSecurityInterceptor: 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 합니다.

 

인증 처리 절차

 

  1. 사용자가 폼에 아이디와 패스워드를 입력하면 HTTPServletRequest에 아이디와 비밀번호가 전달됩니다. 이때 AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 합니다.
  2. 유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 줍니다.
  3. 전달받은 인증 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보냅니다.
  4. UsernamePasswordAuthenticationToken을 AuthenticationProvider에 보냅니다.
  5. 사용자 아이디를 UserDetailService에 보냅니다. UserDetailService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에 전달합니다.
  6. DB에 있는 사용자 정보를 가지고 옵니다.
  7. 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 환료합니다.
  8. 인증이 완료되면 SecurityContextHolder에 Authentication을 저장합니다. 인증 성공 여부에 따라서 AuthenticationSuccessHandler, 실패하면 AuthenticationFailureHandler 핸들러를 실행합니다.

 

스프링 시큐리티 필수 오버라이드 메서드

메서드: getAuthorities()

반환 타임: Collection<?extendsGrantedAuthority>

설명: 사용자가 가지고 있는 권한의 목록을 반환함.

 

메서드: getUsername()

반환 타입: String

설명: 사용자를 식별할 수 있는 사용자 이름을 반환한다. 이때 사용되는 사용자 이름은 반드시 고유해야 한다.

 

메서드: getPassword()

반환 타입: String

설명: 사용자의 비밀번호를 반환한다. 이때 저장되어 있는 비밀번호는 암호화해서 저장해야 한다.

 

메서드: isAccountNonExpired()

반환 타입: boolean

설명: 계정이 만료되었는지 확인하는 메서드. 만약 만료되지 않은 때는 true를 반환

 

메서드: isCredentialsNonExpired()

반환 타입: boolean

설명: 비밀번호가 만료되었는지 확인하는 메서드. 만약 만료되지 않았을 땐 true반환

 

메서드: isEnabled()

반환 타입: boolean

설명: 계정이 사용 가능한지 확인하는 메서드. 만약 사용가능하다면 true 반환

'프레임워크 > Spring Boot' 카테고리의 다른 글

Cookie: 쿠키  (0) 2023.08.29
[Token]토큰 기반 인증  (0) 2023.08.29
타임리프: Thymeleaf  (0) 2023.08.29
[JSON]자바 직렬화와 역직렬화  (0) 2023.08.29
[Spring Boot]Restful API  (0) 2023.08.29