Spring Boot3 & Spring Framework 6 강의 ::Section.7 - SpringSecurityConfiguration

suragryen·2024년 3월 12일
0

Udemy-Spring

목록 보기
16/25

🧑🏻‍🏫 SpringSecurityConfiguration를 파헤쳐 보자

Spring Security 아키텍처

  1. 사용자의 요청이 서버로 들어옵니다.
  2. Authotication Filter가 요청을 가로채고 Authotication Manger로 요청을 위임합니다.
  3. Authotication Manager는 등록된 Authotication Provider를 조회하며 인증을 요구합니다.
  4. Authotication Provider가 실제 데이터를 조회하여 UserDetails 결과를 돌려줍니다.
  5. 결과는 SecurityContextHolder에 저장이 되어 저장된 유저정보를 Spring Controller에서 사용할 수 있게 됩니다.

Spring Security가 작동하는 내부 구조

  1. 사용자가 자격 증명 정보를 제출하면, AbstractAuthenticationProcessingFilter가 Authentication 객체를 생성합니다.

  2. Authentication 객체가 AuthenticationManager에게 전달됩니다.

  3. 인증에 실패하면, 로그인 된 유저정보가 저장된 SecurityContextHolder의 값이 지워지고 RememberMeService.joinFail()이 실행됩니다. 그리고 AuthenticationFailureHandler가 실행됩니다.

  4. 인증에 성공하면, SessionAuthenticationStrategy가 새로운 로그인이 되었음을 알리고, Authentication 이 SecurityContextHolder에 저장됩니다. 이후에 SecurityContextPersistenceFilter가 SecurityContext를 HttpSession에 저장하면서 로그인 세션 정보가 저장됩니다.

그 뒤로 RememberMeServices.loginSuccess()가 실행됩니다. ApplicationEventPublisher가 InteractiveAuthenticationSuccessEvent를 발생시키고 AuthenticationSuccessHandler 가 실행됩니다.

*참조
https://www.elancer.co.kr/blog/view?seq=235


SpringSecurity 사용해보기!

1. 의존성 추가(메이븐)

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
			<version>3.2.3</version>
		</dependency>

업로드중..

의존성을 추가하면 설정하지 않아도 로그인 창이 뜬다.

SpringSecurityConfiguration.java

@Bean
	public InMemoryUserDetailsManager createUserDetailManager() {
	
	//InMemoryUserDetailsManager
	//사용자의 인증 및 권한부여 처리. 
	//개발자가 사용자의 상세 정보를 코드 내에 직접 정의하고 구성
	//간단한 애플리케이션 또는 개발 및 테스트 목적으로 사용될 수 있다. 

		
		UserDetails userDetails1 = createNewUser("soo", "1234");
		UserDetails userDetails2 = createNewUser("loo", "1234");
		
		return new InMemoryUserDetailsManager(userDetails1, userDetails2 );
	}
  • InMemoryUserDetailsManager는 테스트를 목적으로 사용자의 상세 정보를 코드내에 직접 정의하고 구성한다
	private UserDetails createNewUser(String username, String password) {
		Function<String, String> passwordEncoder
		= input -> passwordEncoder().encode(input);
		//받은 문자열을 passwordEncoder() 메서드로 전달하여 암호화한 후 반환.
		//비밀번호를 입력받아 BCryptPasswordEncoder를 사용하여 암호화한 결과를 반환하는 함수
		
		UserDetails userDetails = User.builder().passwordEncoder(passwordEncoder)
		.username(username)
		.password(password)
		.roles("USER", "ADMIN")
		.build();
		return userDetails;
	}

Spring Security는 UserDetails 인터페이스의 구현체를 직접적으로 보안 목적으로 사용하지는 않습니다.
대신에 UserDetails 인터페이스의 구현체는 사용자 정보를 저장하고 나중에 Authentication 객체로 캡슐화됩니다.
이를 통해 보안과 관련이 없는 사용자 정보(예: 이메일 주소, 전화번호 등)를 편리한 위치에 저장할 수 있습니다.
Authentication에서 사용자의 정보값을 불러올 수 있다!

createNewUser: 사용자 이름과 비밀번호를 사용하여 UserDetails 객체를 생성

controller

	private String getLoggedInUsername(ModelMap model) {
		Authentication authentication = 
				SecurityContextHolder.getContext().getAuthentication(); //사용자 정보를 Security에서 받아올 것  
		
		return authentication.getName();
		
	}
  • 사용자 정보를 Security에서 받아온다
  • 현재 로그인한 사용자 정보를 받아온다 !
```
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

	
	http.authorizeHttpRequests(
			auth -> auth.anyRequest().authenticated());
	http.formLogin(withDefaults());
	http.csrf().disable();
	http.headers().frameOptions().disable();
	return http.build();
	//command + shift + t 
	//command + o
	
	
}
  • HttpServeltRequest에 매칭될 수 있는 필터 체인을 정의하는 메소드이다
  • 웹요청이 들어오면 언제나 이 체인이 먼저 처리 한다
  • ex ) 로그아웃 상태로 페이지를 요청하면 로그인 폼이 뜨는 것 SecurityFilterChain의 기본값
  1. All URLs are protected
  2. A login form is shown for unauthorized requests 승인되지 않은 요청에 대해서 로그인 양식 표시

authorizeHttpRequests(): HTTP 요청에 대한 보안 규칙을 정의. anyRequest().authenticated()는 모든 요청에 대해 인증이 필요하다는 것을 의미합니다. 다시 말해, 모든 요청은 인증된 사용자에게만 허용됩니다.

formLogin(): 폼 기반 로그인을 활성화합니다. 이는 사용자가 로그인 페이지로 리디렉션되어 자격 증명을 제출할 수 있도록 합니다. -> 로그인 창이 뜬다!

csrf().disable(): CSRF(Cross-Site Request Forgery) 보호를 비활성화합니다. 이렇게 하면 CSRF 공격에 대한 보호가 제거됩니다.CSRF disable -> H2Database에 접근하려면 CSRF를 비활성 해주어야 한다.

headers().frameOptions().disable(): X-Frame-Options 헤더를 비활성화합니다. 이는 웹 애플리케이션의 내부 페이지를 외부 프레임에서 로드할 수 있도록 합니다.

마지막으로 http.build()를 호출하여 설정한 보안 필터 체인을 빌드하고 반환합니다. 이렇게 하면 필터 체인이 구성되고 Spring Security가 이를 적용할 수 있게 됩니다.

profile
블로그 이사중 ☃︎

0개의 댓글

관련 채용 정보