[spring] (6) Spring Security

orca·2022년 11월 23일
0

Spring

목록 보기
6/13

Authentication and Authorization, 인증과 인가

Application security boils down to two more or less independent problems: authentication (who are you?) and authorization (what are you allowed to do?).
Spring Security has an architecture that is designed to separate authentication from authorization and has strategies and extension points for both.
애플리케이션의 보안은 크게 인증과 인가 두가지임
인증은 <넌 누구니>고 인가는 <너에게 뭐가 허용됐는데?>임
Spring

Authentication :
클라이언트가 누구인지 확인하는 절차
서버는 id, pw를 통해 클라이언트의 신원을 확인함

Authorization :
어떤 리소스에 접근할 수 있는지, 어떤 동작을 수행할 수 있는지 검증하는 절차
서버는 유저의 토큰을 보고 권한이 있는지 판단함

Spring Security


Spring Security has an architecture that is designed to separate authentication from authorization and has strategies and extension points for both.
Spirng Security는 인증과 인가 둘 다 잘 해냄 !
Spring

Spring 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크
Spring Security는 Authentication과 Authorization에 대한 부분을 Filter로서 처리함

What’s the Filter in Spring Security?

💡 Filter
웹 서비스에서 Spring Security는 Spring MVC 앞에서 Servlet Filter로서 동작함
Servlet에 Request시 이 Filter를 반드시 통과해야함
따라서 Spring Security 적용시 모든 Request가 보안 검사를 받게 되는 것


Filter는 프론트 컨트롤러 앞에 위치함

Spring Security in the web tier (for UIs and HTTP back ends) is based on Servlet Filters, so it is helpful to first look at the role of Filters generally.
Spring Security는 Servelet Filters를 기반으로 하므로 먼저 필터의 역할을 살펴보는 것이 중요하다
Spring

Spring Security 예제

💬 HttpSecurity는 Spring Security의 설정 정보를 담는 객체임
HttpSecurity에 설정 정보를 담은 후 빌더로 반환

implementation 'org.springframework.boot:spring-boot-starter-security'
@EnableWebSecurity
@Configuration
public class WebSecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
         httpSecurity.authorizeRequests()
                .anyRequest().authenticated() 
                .and()
                    .formLogin()
                    .defaultSuccessUrl("/")
                    .permitAll() 
                .and()
                    .logout()
                    .permitAll();

         return httpSecurity.build();

    }
}

아래와 같이 HttpSecurity에 메서드를 호출하면 그 설정을 담는 작업 후 자기 자신을 반환함

localhost:8080/login 입력시 Spring Security에서 제공하는 디폴트 로그인 페이지로 접속 가능함

default로 id: user / pw: (콘솔에 찍힌 password) 입력시 로그인 가능하다



로그인 후 페이지

UsernamePasswordAuthenticationFilter

Spring Security의 Filter의 일종으로,
유저의 request에서 username과 password를 가져와 인증을 위한 토큰을 생성함
.formLogin() 이용시 자동으로 적용이 되는 필터
UsernamePasswordAuthenticationFilter 를 열어봄

request 에서 username과 password를 추출해서 UsernamePasswordAuthenticationToken 객체를 생성함!

💡 UsernamePasswordAuthenticationFilter 로직

  1. 사용자가 form에 username과 password 입력함
  2. UsernamePasswordAuthenticationFilterUsernamePasswordAuthenticationToken 을 생성해서, AuthenticationManager 로 전달함
  3. AuthenticationManager 가 유저에 대한 검증을 처리함

WebSecurityConfigurerAdapter Deprecated 에 대한 대응

3월 작성했던 코드를 가지고 공부중인데, deprecated 되어 이를 비교해보았다

WebSecurityConfigurerAdapter 사용시 아래와 같이 Config 구성

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Override
    public void configure(WebSecurity web) {
        web.ignoring().
                antMatchers("/h2-console/**");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .defaultSuccessUrl("/")
                .permitAll()
                .and()
                .logout()
                .permitAll();
    }
}

WebSecurityConfigurerAdapter 사용하지 않는 경우

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig {

    @Bean
    public BCryptPasswordEncoder passwordEncoder(){
        return new BCryptPasswordEncoder();
    }

    @Bean
    public WebSecurityCustomizer webSecurity(){
        return web -> web.ignoring().antMatchers("/h2-console/**");
    }

    @Bean
    SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Exception {
         httpSecurity.authorizeRequests()
                .anyRequest().authenticated() 
                .and()
                    .formLogin()
                    .defaultSuccessUrl("/")
                    .permitAll() 
                .and()
                    .logout()
                    .permitAll();

         return httpSecurity.build();
    }

}

0개의 댓글