@Configuration
@EnableWebSecurity // Spring Security 지원을 가능하게 함
public class WebSecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 설정
http.csrf((csrf) -> csrf.disable());
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll() // resources 접근 허용 설정
.anyRequest().authenticated() // 그 외 모든 요청 인증처리
);
// 로그인 사용
http.formLogin(Customizer.withDefaults());
return http.build();
}
}
프레임워크CSRF (사이트 간 요청 위조 / Cross-site request forgery) :
- 공격자가 인증된 브라우저에 저장된 쿠키의 세션정보를 활용(탈취) 하여 웹서버에 사용자가 의도치않은 요청을 전달.
- 쿠키기반의 취약점을 이용한 공격이기에 REST 방식의 API에서는 disable 이 가능.
- 만약
http://example.com/user.do?cmd=user_passwd_change&user=admin&newPwd=1234이라는 비밀번호 초기화 URL 이 존재하고 사용자가 해당메일을 읽게된다면 사용자의 비밀번호가 초기화되는 방식.
if (StringUtils.hasText(url) &&
(url.startsWith("/api/user") || url.startsWith("/css") || url.startsWith("/js"))
)
http.authorizeHttpRequests((authorizeHttpRequests) ->
authorizeHttpRequests
.requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()// resources 접근 허용 설정
.requestMatchers("/api/user/**").permitAll() // `/api/user~` 의 요청 모두허용
.anyRequest().authenticated() // 그 외 모든 요청 인증처리
);

SESSION 방식으로 구현된다.
FilterChainProxy 를 통해 로직을 구현한다.
Form Login 인증 : 인증이 필요한 URL 요청이 들어왔을 때 인증이 되지않았다면 로그인 페이지를 반환한다.
UsernamePasswordAuthenticationFilterAbstractAuthenticationProcessingFilter 을 상속하는 필터UsernamePasswordAuthenticationToken 유저 정보 토큰을 만들어 매니저에게 인증을 시도SecurityContextHolder 에 세팅SecurityContextHolder 을 비운다.SecurityContextHolder
SecurityContextHolder 를 통해 접근이 가능하다.// 예시코드
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication = new UsernamePasswordAuthenticationToken(principal, credentials, authorities);
context.setAuthentication(authentication); // SecurityContext 에 인증 객체 Authentication 를 저장합니다.
SecurityContextHolder.setContext(context);
AuthenticationUserDetails 객체를 집어넣음<UserDetails>
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
UserRoleEnum role = user.getRole();
String authority = role.getAuthority();
SimpleGrantedAuthority simpleGrantedAuthority = new SimpleGrantedAuthority(authority);
Collection<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(simpleGrantedAuthority);
return authorities;
}
Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
UserDetailsService : 사용자를 조회하고 검증한 후 UserDetails 객체 반환. 커스텀하여 Bean으로 사용가능.
UserDetails : 검증된 유저의 정보객체. SecurityContextHolder 세팅되어 사용된다.

