티스토리 뷰

웹 개발/SpringBoot

Spring Boot Security에 대해

빵파레2 2019. 11. 13. 22:30

※Spring Boot Security란


  • 스프링 기반의 애플리케이션의 보안(인증과 권한처리, 인가 등)을 담당하는 스프링 하위 프레임워크

  • 스프링 부트 시큐리티는 스프링 시큐리티의 번거로운 설정을 간소화 시켜주는 래핑 프레임워크

  • 스프링 부트에서는 스프링 시큐리티를 스터터로 제공함

  • 위와 같이 빌드도구에 의존성만 추가해주면 별도의 설정이 없더라도 스프링 시큐리티가 바로 적용됨 (xml설정이 전혀 필요하지 않아 편리함)

 

Spring Security의 보안 요소


1. 인증 (Authentication)

- 사용자(클라이언트)가 애플리케이션의 특정 동작에 관하여 허락된 사용자인지 확인하는 절차 (ex. 로그인)

 

2. 인가 (Authorize)

- 현재 사용자가 서버의 특정 자원을 사용(접근)할 권한이 있는지 검사하는 것

 

3. 권한 부여 (Authorization)

- 특정 자원이나 서비스에 접근할 수 있도록 권한을 허용하는 것

 

4. 접근 주체 (Principal)

- 보호된 대상에 접근하는 사용자

 

 

Spring security 와 보안 요소의 매칭


 

Spring Boot Security의 인증처리 절차


  1. 클라이언트는 id와 password 값을 입력하여 서버로 인증 요청을 보낸다.

  2. 스프링 시큐리티는 여러개의 필터들의 체인으로 구성되어있는데 그 중 인증필터(UserNamePasswordAuthenticationFilter)에서 클라이언트로부터 받은 id와 password가 담긴 Authentication 객체를 생성한다.

  3. AuthenticationMangerAuthenticationProviderAuthenticationProviderDaoAuthenticationProviderAuthentication 객체를 전달한다. (DB 데이터를 이용한 Credential 인증 방식일 경우)

  4. DaoAuthenticationProvider는 Authentication에 담긴 id값을 매개변수로 하여 UserDetailsService 인터페이스를 구현한 클래스에서 오버라이딩한 loadUserByUserName() 메서드를 호출한다.

  5. loadUserByUserName() 메서드는 매개변수로 전달받은 id값을 이용하여 DB에 접근하고 DB에 저장된 유저 정보를 얻는다. (만약 유저정보가 DB에 없다면 직접 Exception 발생 시키도록 개발)

  6. DB로부터 얻어온 유저정보(id, password, authorities)를 이용하여 스프링 시큐리티에서 지원하는 UserDetails(인증 과정에 필요할법한 정보들을 추상화한 인터페이스) 객체를 만들어 반환한다.

  7. DaoAuthenticationProvider는 반환받은 UserDetails 객체의 비밀번호와 기존의 Authentication 객체에 있던 비밀번호를 비교하여 같다면 인증을 성공시키고, 다르면 인증을 실패시킴(Bad Credentials 예외 발생)

  8. 인증이 성공하면 Authentication 객체에 유저의 principal 정보가 담긴다.

  9. Authentication 객체SecurityContext 내에 저장되어 관리되고 SecurityContextHolder 내에서 SecurityContext가 관리된다. SecurityContextHolder는 기본적으로 *ThreadLocal에 의해 관리된다. 

  10. 또한, 인증처리가 성공하면 SPRING_SECURITY_CONTEXT 라는 속성으로 세션에 인증 정보가 추가된다.

  11. 인증 성공 시 SuccessHandler가 호출되어 성공 로직을 작성할 수 있으며, 인증 실패 시 FailureHandler가 호출되어 실패 로직을 작성할 수 있다.

  12. 만약 다음 요청이 인증처리가 요구되는 요청이라면 먼저 세션에 인증정보가 있는지 확인하고 있다면 인증처리 로직을 생략, 없다면 인증처리 로직 수행하는 방식으로 동작함

 

 

※ ThreadLocal 이란?
- 스레드 내의 데이터 저장소
- 같은 스레드 내에서 공유가능
- 같은 스레드라면 메서드의 파라미터로 넘겨줄 필요 없이 어느 곳에서나 사용 가능 (공유)
- 싱글톤으로 빈을 관리하는 스프링 환경에서 모든 요청마다 공유되는 값이 아닌 각 요청마다 유일한 값을 저장
  하여 사용하고 싶을때 주로사용
- 단, 스프링에서 스레드 또한 스레드 풀내에서 관리되는 공유자원이므로 한번 사용하면 종료되기 전에
  초기화 시켜줘야 함

 

 

Spring boot security를 이용한 인증처리 구현코드


https://github.com/didrlgus/spring-security-jpa