package com.example.springboot.User.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
@Configuration // 이 어노테이션을 달면 빈 설정 담당 클래스가 됨
@EnableWebSecurity // 이 어노테이션을 달면 Security 를 활성화
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Bean // 개발자가 직접 제어 불가능한 외부 라이브러리 등을 Bean으로 만들 때 사용
public PasswordEncoder getPasswordEncoder() {
return new BCryptPasswordEncoder(); // 비밀번호를 암호화 할 수 있는 메소드를 가진 클래스
}
@Override // 해당 메소드가 부모 클래스에 있는 메서드를 Override 했다는 것을 명시적으로 선언 -> 어떤 메소드가 오버라이딩 됐는지 쉽게 파악 가능
protected void configure(HttpSecurity http) throws Exception {
// 같은 패키지나 자식 클래스만 접근 = protected
http
.cors().and()
.csrf().disable()
.formLogin().disable()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/**").permitAll()
.anyRequest().authenticated();
}
}
스프링 시큐리티란 ?
- 자바 서버 개발을 위해 필요로 한 인증, 권한 부여 및 기타 보안 기능을 제공하는 프레임워크(클래스와 인터페이스 모임)
CORS(Cross Origin Resoure Sharing) ?
- 브라우저에서는 보안적인 이유로 cross-origin HTTP 요청들을 제한
- cross-origin 요청을 하려면 서버의 동의가 필요
- 허락을 구하고 거절하는 메커니즘을 HTTP-header를 이용해서 가능한데, 이를 CORS(Cross-Origin Resource Sharing)
- REST API 를 개발할 때 프론트엔드와 백엔드를 연결하기 위해서는 허용해주어야 함
CSRF 란 ?
- 정상적인 사용자가 의도치 않은 위조요청을 보내는 것
- CSRF protection 은 spring security 에서 default 로 설정
- protection을 통해 GET 요청을 제외한 상태를 변화시킬 수 있는 POST, PUT, DELETE 요청으로부터 보호
Rest api 에서의 CSRF
- spring security documentation에 non-browser clients 만을 위한 서비스라면 csrf를 disable 가능
- rest api를 이용한 서버라면, session 기반 인증과는 다르게 stateless하기 때문에 서버에 인증정보를 보관하지 않음(stateless = client와 server의 동작, 상태정보를 저장하지 않는 형태)
- rest api에서는 csrf 공격으로부터 안전 → disable() 하는 것이 좋은 판단
Form login 이란 ?
- Spring Security 에서 제공하는 인증방식
- disable 하는 이유는 로그인 화면을 제거하기 위해서
@Configuration