보안 (Spring Security)

인증 과 인가

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>

위의 starter를 추가하고 웹 애플리케이션을 실행하면 다음과 같은 로그가 출력

메모리에 회원이 하나 자동생성 id : user Using generated security password: 728a3a47-be75-449f-96eb-08276e5a182e

인증을 처리하는 Spring Security필터는 내부적으로 UserDetailsService 를 구현하는 Bean을 사용하여 아이디, 암호가 일치하는지 검사한다.
UserDetailsService를 구현하는 기본 객체가 내부적으로 user정보를 가진다.

UserDetailsService가 가지고 있는 메소드

UserDetails loadUserByUsername(java.lang.String username)
throws UsernameNotFoundException

// spring security 설정 파일은 보통
// WebSecurityConfigurerAdapter 를 상속받아서 만든다.
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    // 아예 인가처리를 하지 않는 (무시하는 URL설정) - 이미지 or css, javascript
    @Override
    public void configure(WebSecurity web) throws Exception {

//    PathRequest.toStaticResources().atCommonLocations()
//    CSS(new String[]{"/css/**"}),
//    JAVA_SCRIPT(new String[]{"/js/**"}),
//    IMAGES(new String[]{"/images/**"}),
//    WEB_JARS(new String[]{"/webjars/**"}),
//    FAVICON(new String[]{"/**/favicon.ico"});
        web.ignoring()
                .requestMatchers(PathRequest.toStaticResources().atCommonLocations())
                .requestMatchers(new AntPathRequestMatcher("/**.html"))
                .requestMatchers(new AntPathRequestMatcher("/static/**"));
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .logout() // logout설정
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/main")
                .permitAll().and()
            .authorizeRequests() // 인가에 대한 설정
                .antMatchers("/users/join").permitAll() // 모든 권한
                .antMatchers("/users/welcome").permitAll()
                .antMatchers("/users/login").permitAll()
                .antMatchers("/users/**").hasAnyRole("USER", "ADMIN") // user, admin을 가지고 있어야
                .antMatchers("/main").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().fullyAuthenticated()
                .and()
            .formLogin() // 사용자가 정의하는 로그인 화면을 만들겠다.
                .loginProcessingUrl("/users/login") // 로그인 화면
                .loginPage("/users/login") // 사용자가 입력한 id, password가 전달되는 url경로(필터가처리)
                .usernameParameter("email")
                .passwordParameter("password")
                .failureUrl("/users/login?fail=true");
    }
}

    @GetMapping("/login")
    public String login(
            @RequestParam(name = "fail",
                    required = false,
                    defaultValue = "false") String errorFlag){

        return "users/login"; // view name 을 리턴한다.
    }