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 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로 넘긴다.
OAuth2
스프링에서 지원하는 인증 프레임 워크
Conditional Annotations : 해당 조건을 만족할 때 설정을 추가하겠다는 어노테이션들
* @ConditionalOnClass
* @ConditionalOnBean
* @ConditionalOnMissingBean
* @ConditionalOnWebApplication
'[공부] 영상 > 스프링 부트 강의' 카테고리의 다른 글
스프링 부트 강의 정리 (31~34 : NoSQL, API Client) (0) | 2019.05.19 |
---|---|
스프링 부트 강의 정리 (28~30 : Database) (0) | 2019.05.19 |
스프링 부트 강의 정리 (23 ~ 25 : 웹플럭스, 컨테이너) (0) | 2019.05.11 |
스프링 부트 강의 정리 (21~22 : 테스트 자동 설정 Annotations) (0) | 2019.04.28 |
스프링 부트 강의 정리 (19~20 : 테스트, MockBean) (0) | 2019.04.28 |