Spring Security
- 보안과 관련된 인증(Authentication) / 권한부여(Authorization) 기능 제공
Spring Security 실습할 view 준비하기
- Thymeleaf로 view rendering을 할 것이므로, spring-boot-starter-thymeleaf 의존성 추가
- 컨트롤러 추가하여 "/hello" 및 "/my" GetMapping
- index / hello / my html 생성
테스트1
- @WebMvcTest로 MockMvc 주입받기
- hello / my에 get요청을 보내는 @Test 생성 (mockMvc.perform(get("/hello"))
- ResultActions의 andExpect(view().name("hello"))로 이름 확인!
cf) 아무의미 없는 HTTP요청을 맵핑할 때, 핸들러를 만들지 않는 방법
- 컨트롤러 로직이 필요없고, 특정 요청을 view로만 보내면 되는 한정적인 경우 사용
- WebMvcConfigurer Interface를 Implements하는 @Configuration Class 생성
- addViewControllers 메소드 오버라이딩하여서, 파라미터로 받는 ViewControllerRegistry 객체의 addViewController(urlPath) 메소드 사용
- 반환하는 객체를 체이닝하여 setViewName(viewName) 메소드 사용
- 해당 URL에 viewName이 맵핑된다.
Spring Security 사용하기
- 목표 : /hello는 인증없이, /my는 인증필요
- 의존성 추가 : spring-boot-starter-security
- 추가하면 바로 테스트가 실패한다.
- 스프링 부트에 의한 스프링 시큐리티 자동 설정
- 모든 요청이 인증을 요구하게 됨
- Basic Authentiction & Form-based Authentication 적용
인증방식
- HTTP요청이 원하는 응답의 형태(Accept 헤더)에 따라 달라진다
- Accept: text/html의 경우 Form 인증 요구
- 그 외: Basic 인증 요구
- 웹 브라우저 요청의 기본 Accept Header = text/html
- 따라서 브라우저에서 직접 테스트할 땐, 항상 Form 인증
- 그 외 Accept Header는 테스트 과정에서 확인할 수 있다. (401 Unauthorized Error)
cf) Form 인증을 통과하는 유저/패스워드 자동생성
- 어플리케이션을 실행시키면, 폼 인증을 통과할 수 있는 비밀번호를 만들어준다 ㅋㅋ
- 스프링 부트 자동설정에 의해
- 아이디는 user
- 패스워드는 콘솔에 출력
테스트2
- get 메소드가 반환하는 MockHttpServletRequestBuilder 객체의 accept 메소드를 사용해 text/html 요청 설정.
- Accept: text/html을 사용한 mockMvc 요청과, 사용하지 않은 요청의 실패 사유를 비교
- Basic 인증의 경우 401 Unauthorized Error
- Form 인증의 경우 302 Found (3xx번대는 리다이렉트)
스프링 부트에 의해 자동설정되는 스프링 시큐리티
- 개발자가 해당 설정을 별도 생성하지 않으면, 적용되는 자동 설정이 대부분
- 스프링 부트가 자동설정해주는 부분은 그리 많지 않음
1. SecurityAutoConfiguration
- DefaultAuthenticationEventPublisher 등록
- 유저이름이 없다거나, 비밀번호 오류, 계정 만료 등의 이벤트 핸들러 구현 가능
- 해당 이벤트 퍼블리셔는 스프링 시큐리티에도 존재하는 클래스.
- 스프링 부트는 자동으로 Bean 등록을 해주는 것에 불과!
2. SpringBootWebSecurityConfiguration
- WebSecurityConfigurerAdapter를 extends하는 static class DefaultConfigurerAdapter를 가진다.
- 여기서도 빈 등록의 우선순위만 설정해주는 등의 간단한 설정!
- 즉, 시큐리티의 초기 설정을 대부분 따른다.
- WebSecurityConfigurerAdapter의 중요 메소드 getHttp()을 변화 없이 사용!
3. UserDetailsServiceAutoConfiguration
- 그나마 스프링 부트가 많이 설정해주는 부분
- 어플리케이션 시작 시, 인증가능한 유저/패스워드 설정
- @ConditionalOnMissingBean으로 해당 클래스들이 없을 때만 등록됨
- AuthenticationManager
- AuthenticationProvider
- UserDetailsService
스프링 시큐리티 사용 환경을 테스트하기
- 의존성 추가 : spring-security-test
- 테스트 메소드 OR 테스트 클래스에 @WithMockUser 선언
(인증되는 가짜 유저 적용)
'학습 > Spring' 카테고리의 다른 글
[spring] 스프링 부트에서 REST Client 이용하기 (0) | 2020.05.23 |
---|---|
[spring] 스프링 부트에서 Spring Security 커스터마이징하기 (0) | 2020.05.21 |
[spring] 스프링 부트에서 Redis 사용하기 (0) | 2020.05.18 |
[spring] 데이터베이스 초기화 및 마이그레이션 (0) | 2020.05.17 |
[spring] 스프링 어노테이션 및 메소드 정리 (1) | 2020.05.10 |
댓글