kok202
스프링 부트 강의 정리 (26 ~ 27 : Security)

2019. 5. 11. 05:08[공부] 영상/스프링 부트 강의

Security content 는 요청에따라 httpBasic 또는 fomLogin 중 어떤 것을 사용할지 판단하기 위해 Spring-security negotiation 전략을 사용한다. 스프링 부트 기본 설정 상으로 AuthenticationManager 유저가 하나 존재한다. 유저의 이름은 user이다. 패스워드는 INFO level의 logger 에서 랜덤하게 생성되서 출력된다.  원한다면 spring.security.user.name, spring.security.user.password 를 이용해서 수정할 수 있다.

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Data
public class User {
    private int id;
    private String name;
    private int age;
}
@RestController("/users")
public class UserController {
   @GetMapping("/{userId}")
   public User getUser(@PathVariable int userId){
       User mockUser = new User();
       mockUser.setId(userId);
       mockUser.setName("kok202");
       mockUser.setAge(99);
       return mockUser;
   }
}

Security dependency 를 추가하면 login 관련 페이지를 만들지 않아도 form 과 함께 login 페이지가 생긴다. (url : localhost:8080/login) 이후 만약 사용자가 localhost:8080/users/1234 와 같이 요청을 하면 login 페이지르 리다이렉트가 되고 login 에서 인증을 통과해야만 User 데이터를 가져올 수 있다.

 

 

 

 

 

인증 핸들러

@Component
public class AuthenticationHandlers {
    @EventListener
    public void handleBadCredential(AuthenticationFailureBadCredentialsEvent event){
        String id = event.getAuthentication.getPrincipal();
        System.out.println("아이디 : " + id + " 로 인증을 시도 했으나 비밀번호가 틀렸을 경우");
    }
}

event 정보를 어딘가에 기록해서 잘못된 인증을 계속 시도하는 사용자를 기록할 수 있다.

 

 

 

 

 

MVC Security

기본적으로 시큐리티 설정은 SecurityAutoConfiguration 으로 구현되고 이로 부터 import 해와서 사용한다. 

SecurityAutoConfiguration 에는 아래와 같은 설정들이 들어있다.

- SpringBootWebSecurityConfiguration : 웹 보안

- AuthenticationManagerConfiguration : 인증 설정, 웹이 아닌경우에도 관련이 있다.

- ...

웹 어플리케이션 Security를 위한 기본 설정을 끄고 싶으면 WebSecurityConfigurerAdapter 를 사용 하면 된다. WebSecurityConfigurerAdapter 를 이용하면 커스텀한 접근 룰 과 같은 것을 완전히 오버라이딩 할 수 있다. WebSecurityConfigurerAdapter 를 이용하는 방법은 해당 타입으로 빈을 만들고 추가하면 된다.

 

AuthenticationManagerConfiguration 을 끄고 싶으면 UserDetailsService, AuthenticationProvider, or AuthenticationManager 를 사용하면 된다. 각종 스프링 부트 관련 샘플들은 아래 링크를 참조하면 좋다.

https://github.com/spring-projects/spring-boot/tree/v2.1.4.RELEASE/spring-boot-samples/

 

spring-projects/spring-boot

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

 

기본적으로 Spring security 는 모든 리소스의 접근을 막는다.

-> static 에 있는 리소스도 막힌다.

-> static 에 있는 리소스가 막히는 것을 풀고 싶다면 아래 코드중 MySecurityConfig 클래스를 참조하자.

@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    http.authorizeRequests()
        .requestMatchers(PathRequest.toStaticResources().atCommonLocations()).permitAll()
        .requestMatchers(new AntPathRequestMatcher("/index.html")).permitAll() 
        .anyRequest().fullyAuthenticated()
        .and()
        .formLogin().permitAll()
        .and()
        .logout().permitAll()
 }

PathRequest.toStaticResources() 에 html 을 위한 resource path 가 없으므로 static 안의 html 파일은 접근이 안된다.
resources/static/index.html 은 접근을 풀어주고 싶기 때문에 AntPathRequestMatcher를 사용했다.

 

RequestMatcher

management.endpoints.web.base-path 설정 기반

 

RequestMatcher 를 만드는 법

방법 1. EndpointRequest

방법 2. PathRequest

 

 

 

 

 

 

WebFlux Security

웹플럭스도 security 를 할 수 있고 MVC security 과 거의 유사하다. 마찬가지로 기본적으로 시큐리티 설정은 ReactiveSecurityAutoConfiguration 으로 구현되고 이로 부터 import 해와서 사용한다. 

ReactiveSecurityAutoConfiguration 에는 아래와 같은 설정들이 들어있다.

- WebFluxSecurityConfiguration : 웹 보안

- ReactiveAuthenticationManagerConfiguration : 인증 설정

사실상 구조가 MVC Security 와 똑같고 클래스 이름만 조금씩 다르므로 자세한 내용은 Document로 넘긴다.

https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-security.html#boot-features-security-webflux

 

30. Security

If you have spring-security-oauth2-client on your classpath, you can take advantage of some auto-configuration to make it easy to set up an OAuth2/Open ID Connect clients. This configuration makes use of the properties under OAuth2ClientProperties. The sam

docs.spring.io

 

 

 

 

 

 

OAuth2

스프링에서 지원하는 인증 프레임 워크

 

 

 

 

 


Conditional Annotations : 해당 조건을 만족할 때 설정을 추가하겠다는 어노테이션들

* @ConditionalOnClass

* @ConditionalOnBean

* @ConditionalOnMissingBean

* @ConditionalOnWebApplication