※ Config 파일 : 스프링 시큐리티 인증/ 인가를 다루는 파일
import 부분
@EnableGlobalMethodSecurity
- Use EnableMethodSecurity instead. Enables Spring Security global method security similar to the <global-method-security> xml support. More advanced configurations may wish to extend GlobalMethodSecurityConfiguration and override the protected methods to provide custom implementations.
@EnableWebSecurity
- is used for spring security java configuration. Add this annotation with @configuration on top of your security java class that extends WebSecurityConfigurerAdapter. Override the configure(WebSecurity web) & configure(HttpSecurity http) . WebSecurityConfigurerAdapter를 상속받은 config 클래스에 @EnableWebSecurity 어노테이션을 달면SpringSecurityFilterChain이 자동으로 포함됩니다.
passwordEncoder / securityFilterChain
- passwordEncoder : 비밀번호 암호화
- antMatchers() 로 지정할 수 있는 항목
- hasRole() or hasAnyRole() : 특정 권한을 가지는 사용자만 접근할 수 있습니다.
- hasAuthority() or hasAnyAuthority() : 특정 권한을 가지는 사용자만 접근할 수 있습니다.
- hasIpAddress() : 특정 아이피 주소를 가지는 사용자만 접근할 수 있습니다.
- permitAll() or denyAll() : 접근을 전부 허용하거나 제한합니다.
- rememberMe() : 리멤버 기능을 통해 로그인한 사용자만 접근할 수 있습니다.
- anonymous() : 인증되지 않은 사용자가 접근할 수 있습니다.
- authenticated() : 인증된 사용자만 접근할 수 있습니다.
corsConfigurationSource
- corsConfigurationSource : CORS 에러 해결을 위한 부분
CORS란?
- HTTP 요청은 기본적으로 Cross-Site HTTP Requests가 가능하다. Simple 하게 다른 도메인의 Resource를 사용하는것을 의미한다. 하지만 Cross-Site HTTP Requests는 Same Origin Policy를 적용 받기 때문에 요청이 불가하다. 즉 프로토콜, 호스트명, 포트가 같아야만 요청이 가능하다.
SPA(Single Page Application) 개발이 보편적으로 이루어 지고있어서 Front , Back사이에 도메인이 달라지는 경우가 많다 이경우에는 CORS 허용 정책이 필요하다.
서비스 배포 후 최종 버전
@Configuration
@RequiredArgsConstructor
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig {
private final JwtUtil jwtUtil;
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
// CSRF 설정
http.csrf().disable();
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
http.httpBasic().disable()
.authorizeRequests()
.antMatchers("/api/users/**").permitAll()
.antMatchers(HttpMethod.GET, "/**").permitAll()
.anyRequest().authenticated()
.and()
.addFilterBefore(new JwtAuthFilter(jwtUtil),UsernamePasswordAuthenticationFilter.class);
http.cors();
return http.build();
}
@Bean
public CorsConfigurationSource corsConfigurationSource(){
CorsConfiguration config = new CorsConfiguration();
config.addAllowedOrigin("http://localhost:3000"); // 프론트엔드 로컬서버
config.addAllowedOrigin("http://the-greatest-minkyu.s3-website.ap-northeast-2.amazonaws.com/"); // 프론트엔드 S3서버
config.addExposedHeader(JwtUtil.AUTHORIZATION_HEADER);
config.addAllowedMethod("*");
config.addAllowedHeader("*");
config.setAllowCredentials(true);
config.validateAllowCredentials();
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return source;
}
}
[ 참고자료 ]
'항해99 개발 일지 > [7주차] 클론 프로젝트' 카테고리의 다른 글
[06] Spring 이메일 인증 구현 (1) | 2023.01.01 |
---|---|
[05] Spring 페이징처리 + 키워드 검색기능 구현 (0) | 2022.12.30 |
[04] OAuth 2.0 카카오 로그인 구현 (0) | 2022.12.28 |
[03] S3 이미지파일 다중업로드 (0) | 2022.12.27 |
[02] Airbnb Clone Coding (Main CRUD) (0) | 2022.12.27 |