본문 바로가기
학습/Spring

[spring] 스프링 부트에서 Spring Security 사용하기

by KKambi 2020. 5. 19.

Spring Security

  • 보안과 관련된 인증(Authentication) / 권한부여(Authorization) 기능 제공

 


 

Spring Security 실습할 view 준비하기

  1. Thymeleaf로 view rendering을 할 것이므로, spring-boot-starter-thymeleaf 의존성 추가
  2. 컨트롤러 추가하여 "/hello" 및 "/my" GetMapping
  3. index / hello / my html 생성

 

 

테스트1

  1. @WebMvcTest로 MockMvc 주입받기
  2. hello / my에 get요청을 보내는 @Test 생성 (mockMvc.perform(get("/hello"))
  3. ResultActions의 andExpect(view().name("hello"))로 이름 확인!

 

 

cf) 아무의미 없는 HTTP요청을 맵핑할 때, 핸들러를 만들지 않는 방법

  • 컨트롤러 로직이 필요없고, 특정 요청을 view로만 보내면 되는 한정적인 경우 사용
    1. WebMvcConfigurer Interface를 Implements하는 @Configuration Class 생성
    2. addViewControllers 메소드 오버라이딩하여서, 파라미터로 받는 ViewControllerRegistry 객체의 addViewController(urlPath) 메소드 사용
    3. 반환하는 객체를 체이닝하여 setViewName(viewName) 메소드 사용
    4. 해당 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)

 

브라우저 테스트 시, Form 인증을 요구하는 /login 으로 리다이렉트된다.

 

cf) Form 인증을 통과하는 유저/패스워드 자동생성

  • 어플리케이션을 실행시키면, 폼 인증을 통과할 수 있는 비밀번호를 만들어준다 ㅋㅋ
  • 스프링 부트 자동설정에 의해
  • 아이디는 user
  • 패스워드는 콘솔에 출력

 

테스트2

  1. get 메소드가 반환하는 MockHttpServletRequestBuilder 객체의 accept 메소드를 사용해 text/html 요청 설정.
  2. Accept: text/html을 사용한 mockMvc 요청과, 사용하지 않은 요청의 실패 사유를 비교
  3. Basic 인증의 경우 401 Unauthorized Error
  4. 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 선언

(인증되는 가짜 유저 적용)

 

 

댓글