728x90
build.gradle 내 dependencies 추가
implementation 'org.springframework.boot:spring-boot-starter-security'
WebSecurityConfig.java
1) SecurityFilterChain : 특정 Http 요청에 대해 웹 기반 보안 구성. 인증/인가 및 로그아웃을 설정
@Bean
public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
httpSecurity
.csrf(AbstractHttpConfigurer::disable)
.cors((cors) -> cors.configurationSource(corsConfigurationSource()))
.httpBasic(AbstractHttpConfigurer::disable)
.formLogin(AbstractHttpConfigurer::disable)
.authorizeHttpRequests((authorize) -> authorize
.requestMatchers("/", "/movie/**")
.permitAll()
.anyRequest().authenticated())
.exceptionHandling((exception) -> exception
.authenticationEntryPoint(unauthorizedEntryPoint).accessDeniedHandler(accessDeniedHandler))
.logout((logout) -> logout
.logoutSuccessUrl("/movie/login")
.invalidateHttpSession(true))
.sessionManagement((session) -> session
.sessionCreationPolicy(SessionCreationPolicy.STATELESS));
return httpSecurity.build();
}
- csrf() (Cross site Request forgery) : 정상적인 사용자가 의도치 않은 위조 요청 보내는것으로 API 기반 인증에서는 일반적으로 비활성화
- cors() : 교차 출처 리소스 공유, 출처가 다른 리소스 간의 공유
- authorizeHttpRequests()
- requestMatchers() : 특정 요청과 일치하는 url에 대한 access 설정
- permitAll() : requestMatchers에서 지정된 url 인증,인가 없이도 접근 허용 (ignoing() -> 허락x)
- anyRequest().authenticatied() : 이 외 모든 요청은 인증이 필요
- exceptionHandling() : 401, 403 예외처리
- formLogin() : HTTP Basic 및 기본 제공 폼 로그인 방식. JSON 기반의 커스텀 인증 사용 시 비활성화
- httpBasic() : 토큰 기반 인증(예: JWT, OAuth 2.0) 사용하는 경우 비활성화
- logout()
- logoutSuccessUrl() : 로그아웃 시 리다이렉트될 주소
- invalidateHttpSession() : 세션에 저장된 모든 데이터 삭제 여부 설정(true 시 저장된 모든 데이터 삭제되며 현재 세션을 완전히 무효화시킴)
- sessionManagement()
- sessionCreationPolicy(SessionCreationPolicy.STATELESS)) : HTTP 세션을 사용하지 않도록 설정하는 역할. RESTful API와 같은 상태 없는(stateless) 인증 방식에서 사용. JWT(JSON Web Token) 또는 다른 토큰 기반 인증 방식을 사용할 때 주로 사용되며, 서버는 상태를 저장하지 않고, 클라이언트가 제공하는 토큰을 통해 인증을 처리한다.
2) corsConfigurationSource() : 교차 출처 리소스 공유위해 cors 설정
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration config = new CorsConfiguration(); // 허용할 origin 설정
config.addAllowedOrigin("http://localhost:3000");
config.setAllowCredentials(true); // 쿠키 허용
config.addAllowedHeader("*"); // 모든 헤더 허용
config.addAllowedMethod("*"); // 모든 http 메소드 허용
/*
* config.setExposedHeaders(Arrays.asList("Access-Control-Allow-Headers",
* "Authorization, x-xsrf-token, Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, "
* ,
* "Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers"
* )); // 헤더 요청 열어둠
*/
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config); // 모든 경로에 대해 위 설정 적용
return source;
}
3) exceptionHandler 설정
// 401 Unauthorized 응답을 반환
private final AuthenticationEntryPoint unauthorizedEntryPoint = (request, response, authException) -> {
ErrorResponse fail = new ErrorResponse(HttpStatus.UNAUTHORIZED, "Spring security unauthorized...");
response.setStatus(HttpStatus.UNAUTHORIZED.value());
String json = new ObjectMapper().writeValueAsString(fail);
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
PrintWriter writer = response.getWriter();
writer.write(json);
writer.flush();
};
// 403 Forbidden 응답을 반환
private final AccessDeniedHandler accessDeniedHandler = (request, response, accessDeniedException) -> {
ErrorResponse fail = new ErrorResponse(HttpStatus.FORBIDDEN, "Spring security forbidden...");
response.setStatus(HttpStatus.FORBIDDEN.value());
String json = new ObjectMapper().writeValueAsString(fail);
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
PrintWriter writer = response.getWriter();
writer.write(json);
writer.flush();
};
@Getter
@RequiredArgsConstructor
public class ErrorResponse {
private final HttpStatus status;
private final String message;
}
728x90
반응형
'Framework > Spring' 카테고리의 다른 글
[Spring / ToyProject] Spring Security 설정 - 2_1 (0) | 2025.01.14 |
---|---|
[Spring / ToyProject] 에러일지: Request failed with status code 403 (0) | 2025.01.08 |
[Spring / ToyProject] Spring-boot/React 초기 세팅 (0) | 2025.01.03 |
[Spirng/개념] 스프링 MVC 구조 (1) | 2024.10.16 |
[Spring/개념] 기본 구조 (1) | 2024.10.14 |