Framework/Spring Boot

Spring Security

잔망루피 2022. 10. 6. 23:24
// https://spring.io/guides/gs/securing-web/
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		http
			.authorizeHttpRequests((requests) -> requests
				.requestMatchers("/", "/home").permitAll()
				.anyRequest().authenticated()
			)
			.formLogin((form) -> form
				.loginPage("/login")
				.permitAll()
			)
			.logout((logout) -> logout.permitAll());

		return http.build();
	}

	@Bean
	public UserDetailsService userDetailsService() {
		UserDetails user =
			 User.withDefaultPasswordEncoder()
				.username("user")
				.password("password")
				.roles("USER")
				.build();

		return new InMemoryUserDetailsManager(user);
	}
}
@EnableWebSecurity Spring Security의 web security support를 가능하게 한다.
Spring MVC 통합을 제공
SecurityFilterChain 어떤 URL 경로에 보안을 적용할지 안할지를 정의
위의 코드에서 /, /home는 인증없이 접근 가능
다른 URL 경로는 인증을 받아야 한다.
유저가 성공적으로 로그인을 하면 이전에 요청했던 페이지(인증이 필요했던)로 redirect된다.

 


spring.security.basic.enable=false

application.properties에 추가하면, 스프링 시큐리티 기본 인증 비활성화


public class AuthenticationFilter extends org.springframework.web.filter.OncePerRequestFilter

특정한 요청의 인증을 수행하는 Filter

  1. 요청이 들어온다. setRequestMathcher(RequestMatcher)와 일치하지 않으면 이 필터는 아무것도 하지않는다. FilterChain이 계속된다.
  2. 만약 일치한다면 HttpServletRequest를 인증으로 변환하려는 시도를 한다. 결과가 빈다면, 필터는 더 이상 아무것도 하지않는다. FilterChain이 계속된다. 
  3. 인증이 생성되면 AuthenticationFilter(AuthenticationManager, AuthenticationConverter)에 지정된 AuthenticationManager가 인증을 수행하기 위해 사용된다.
  4. AuthenticationFilter(AuthenticationManagerResolver, AuthenticationConverter)에 지정된 AuthenticationManagerResolver는 인증을 하기 위해 context에서 적절한 인증 관리자를 확인하는 데 사용된다.
  5. 인증이 성공하면, AuthenticationSuccessHandler가 호출되고 SecurityContextHolder에 인증이 설정된다. 그렇지 않으면 AuthenticationFailureHandler가 호출된다.

 

public class UsernamePasswordAuthenticationToken  extends AbstractAuthenticationToken

username, password를 간단히 표시하도록 설계된 인증 구현

주체 및 자격 증명은 Object.toString() 메서드를 통해 각 속성을 제공하는 개체로 설정해야 한다.

이러한 개체를 사용할 수 있는 가장 간단한 것은 문자열이다.

 

 

public interface AuthenticationManager

인증 요청 처리

 

 

public interface AuthenticationProvider

클래스가 특정 인증 구현을 처리할 수 있음을 나타낸다.

 

 

public interface UserDetailsService

사용자별 데이터를 로드하는 코어 인터페이스

프레임워크 전체에서 사용자 DAO로 사용되며 DaoAuthenticationProvider에서 사용되는 전략

인터페이스는 하나의 읽기 전용 방식만 요구하므로 새로운 데이터 액세스 전략에 대한 지원을 단순화

 

 

public interface UserDetails extends java.io.Serializable

코어 사용자 정보를 제공

구현은 보안 목적을 위해 Spring Security에서 직접 사용되지 않는다.

사용자 정보를 저장하기만 하면 나중에 Authentication 객체에 캡슐화된다.

이를 통해 보안과 관련이 없는 사용자 정보(이메일 주소, 연락처와 같은)를 편리한 위치에 저장할 수 있다.

구체적인 구현은 각 방법에 대해 상세히 기술된 무효 계약이 시행되도록 각별히 주의해야 한다.

구현은 null이 아닌 반대되는 구체적인 각각의 메소드를 보장하기 위해 특수한 케어를 한다.

java.util.Collections<? extends GrantedAuthority> getAuthorities() 사용자에게 부여된 권한을 반환
java.lang.String getPassword() 사용자를 인증하기 위해 사용한 비밀번호를 반환
java.lang.String getUsername() 사용자를 인증하기 위해 사용한 아이디를 반환
boolean isAccountNonExpired() 사용자의 계정이 만료되었는지 여부를 나타냄
true = 사용자 계정이 아직 만료되지 않았을 때
boolean isAccountNonLocked() 사용자의 계정이 잠겼는지 여부를 나타냄
true = 사용자 계정이 잠기지 않았을 때
boolean isCredentialsNonExpired() 사용자의 자격 증명(비밀번호)이 만료되었는지 여부를 나타냄
true = 만료되지 않았을 때
boolean isEnabled() 사용자가 활성화/비활성화되었는지 나타냄
true = 사용자가 활성화되었을 때

 

 

참고 👇

https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/web/authentication/AuthenticationFilter.html

 

AuthenticationFilter (spring-security-docs 5.7.3 API)

 

docs.spring.io

 

https://docs.spring.io/spring-security/site/docs/4.0.x/apidocs/org/springframework/security/authentication/UsernamePasswordAuthenticationToken.html

 

UsernamePasswordAuthenticationToken (Spring Security 4.0.4.RELEASE API)

See Authentication.isAuthenticated() for a full description. Implementations should always allow this method to be called with a false parameter, as this is used by various classes to specify the authentication token should not be trusted. If an implementa

docs.spring.io

 

https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/authentication/AuthenticationManager.html

 

AuthenticationManager (spring-security-docs 5.7.3 API)

Attempts to authenticate the passed Authentication object, returning a fully populated Authentication object (including granted authorities) if successful. An AuthenticationManager must honour the following contract concerning exceptions: A DisabledExcepti

docs.spring.io

 

https://docs.spring.io/spring-security/site/docs/4.0.x/apidocs/org/springframework/security/authentication/AuthenticationProvider.html

 

AuthenticationProvider (Spring Security 4.0.4.RELEASE API)

Returns true if this AuthenticationProvider supports the indicated Authentication object. Returning true does not guarantee an AuthenticationProvider will be able to authenticate the presented instance of the Authentication class. It simply indicates it ca

docs.spring.io

 

https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/userdetails/UserDetailsService.html

 

UserDetailsService (spring-security-docs 5.7.3 API)

Core interface which loads user-specific data. It is used throughout the framework as a user DAO and is the strategy used by the DaoAuthenticationProvider. The interface requires only one read-only method, which simplifies support for new data-access strat

docs.spring.io

 

https://docs.spring.io/spring-security/site/docs/current/api/org/springframework/security/core/userdetails/UserDetails.html

 

UserDetails (spring-security-docs 5.7.3 API)

Provides core user information. Implementations are not used directly by Spring Security for security purposes. They simply store user information which is later encapsulated into Authentication objects. This allows non-security related user information (s

docs.spring.io

 

반응형