[스프링부트 #7] Spring Security

김지현·2023년 11월 17일
0

스프링 시큐리티는 스프링 서버에 필요한 인증 및 인가를 위해 많은 기능을 제공해주는 스프링의 하위 프레임워크이다. 기본적으로 세션/쿠키 방식으로 인증한다.

  • build.gradle에 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
  • Spring Security 활성화
@SpringBootApplication
public class SpringAuthApplication {
	public static void main(String[] args) {
		SpringApplication.run(SpringAuthApplication.class, args);
	}
}

시큐리티를 활성화하면 다음과 같은 default 로그인 기능을 제공한다.

Spring Security 모듈

SecurityContextHolder

SecurityContext는 인증이 완료된 사용자의 상세 정보(Authentication)를 저장한다. Authentication는 현재 접근하는 주체(인증된 사용자)의 정보와 권한을 담는 인터페이스이다.
SecurityContextHolder를 통해 SecurityContext에 접근하고, SecurityContext를 통해 Authentication에 접근할 수 있다.

UsernamePasswordAuthentication

UsernamePasswordAuthenticationFilter는 Spring Security의 필터인 AbstractAuthenticationProcessingFilter를 상속한 Filter이다. Form Login 기반을 사용할 때 username 과 password 확인하여 인증한다.

UsernamePasswordAuthenticationToken은 Authentication을 implements한 AbstractAuthenticationToken의 하위 클래스로 User의 ID가 Principal 역할을 하고, Password가 Credential의 역할을 한다. 위의 필터에서 사용자의 정보를 담은 토큰을 만들어 AuthenticationManager에게 넘겨준다.

인증에 대한 부분은 Authentication Manager를 통해서 처리하게 되는데 인증에 성공하면 생성자를 이용해 객체를 생성하여 Security Context에 저장한다. 인증 상태를 유지하기 위헤 세션에 보관하며 인증이 실패한 경우에는 AuthenticationException을 발생시킨다.

UserDetails

인증에 성공하면 UserDeails 객체가 생성된다. 검증된 UserDetails는 Authentication객체를 구현한 UsernamePasswordAuthenticationToken을 생성하기 위해 사용되며 해당 인증 객체는 SecurityContextHolder에 세팅된다.

UserDetailsService

UserDetailsService 인터페이스는 UserDetails 객체를 반환하는 단 하나의 메소드를 가지고 있다. username/password 인증방식을 사용할 때 사용자를 조회하고 검증한 후 UserDetails를 반환한다. 일반적으로 이를 구현한 클래스의 내부에 UserRepository를 주입받아 DB와 연결하여 처리한다.

Spring Security 처리 과정

  1. 사용자가 아이디, 비밀번호로 로그인을 요청
  2. AuthenticationFilter에서 UsernamePasswordAuthenticationToken을 생성하여 AuthenticaionManager에게 전달
  3. AuthenticaionManager는 등록된 AuthenticaionProvider을 조회하여 인증을 요구
  4. AuthenticaionProvider는 UserDetailsService를 통해 입력받은 아이디에 대한 사용자 정보를 DB에서 조회
  5. 입력받은 비밀번호를 암호화하여 DB의 비밀번호화 매칭되는 경우 인증이 성공된 UsernameAuthenticationToken을 생성하여 AuthenticaionManager로 반환
  6. AuthenticaionManager는 UsernameAuthenticaionToken을 AuthenticaionFilter로 전달
  7. AuthenticationFilter는 전달받은 UsernameAuthenticationToken을 LoginSuccessHandler로 전송하고, SecurityContextHolder에 저장

0개의 댓글