본문 바로가기
Spring

Spring_스프링 시큐리티

by 유서담 2024. 3. 12.

스프링 시큐리티

 

= 스프링 시큐리티는 애플리케이션에 대한 인증/인가를 보안을 담당하는 프레임워크

 

 

인증(Authentiction)

  • 사용자의 신원을 확인하는 과정
  • 해당 사용자가 본인이 맞는지 확인하는 과정

 

인가(Authorization)

  • 해당 사용자가 요청하는 자원을 실행할 수 있는 권한을 가지고 있는지 확인하는 과정
  • 인가과정은 항상 인증과정이 선행된다 (인증되지 않은 사용자는 사용자의 권한을 확인할 수 없기 때문에 인가과정을 처리할 수 없다)

 

 

스프링 시큐리티 태그 라이브러리

 

스프링 시큐리티 의존성 주입

 

 

태그 라이브러리 종류

 

<sec:> 인 이유는 prefix명을 sec로 정해서

 

 

권한태그 : access 속성의 값을 판정해서 태그내의 내용을 표현할지 여부를 결정한다

<sec:authorize>

 

예시

 

익명 사용자일때 isAnonymous( )는 true로 판정된다

<sec:authorize access="isAnonymous( )">
	<a href=" ">로그인</a>
</sec>

 

 

인증된 사용자 일때 isAuthenticated( )는 true로 판정된다

<sec:authorize access="isAuthenticated()">
	<a href="">로그아웃</a>
</sec>

 

 

인증된 사용자가 설정된 권한을 보유하고 있을 때

hasRole('ROLE_ADMIN')는 인증된 사용자가 관리자 권한을 가지고 있을 때 true로 판정된다

<sec:authorize access="hasRole('ROLE_ADMIN')">
	<a href="">사용자 관리</a>
	<a href="">상품 관리</a>
	<a href="">장바구니 관리</a>
	<a href="">주문 관리</a>
</sec:authorize>

 

 

인증된 사용자가 설정된 권한 중 하나의 권한을 보유하고 있을 때

hasRole('ROLE_ADMIN', 'ROLE_MANAGER')은 인증된 사용자가 ADMIN 혹은 MANAGER 권한 중 하나를 가지고 있을 때 true로 판정된다

<sec:authorize access="hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')">

</sec:authorize>

 

 

 

인증태그 : 인증된 사용자 정보를 가지고 있는 Authentication 객체에 대한 접근을 제공하는 태그다

<sec:authentication>

 

 

 

 

 

스프링 시큐리티 설정

 

SecurityFilterChain

  • Spring Security에서 제공하는 인증, 인가를 위한 필터들을 관리하는 객체
  • 기본적으로 제공하는 필터들이 있으며, 개발자는 애플리케이션의 개발목적에 맞게 사용자 정의 필터를 추가하거나 SecurityFilterChain의 필터를 설정할 수 있다

 

주요필터

 

 

 

UsernamePasswordAuthenticationFilter

  • username/password로 로그인하려고 하는지 체크해서 사용자 인증 작업을 수행하는 필터

 

AnonymousAuthenticationFilter

  • 앞선 여러 필터를 통해서 인증이 아직 완료되지 않았다면 Authentication 객체를 생성하고, 익명사용자로 설정하는 역할을 수행

 

LogoutFilter

  • 클라이언트의 요청이 로그아웃 요청인지 파악하고, 로그아웃 작업을 수행

 

SecurityContextPersistenceFilter

  • 클라이언트의 요청이 접수되면 SecurityContextRepository에서 SecurityContext를 가져오거나 생성하는 역할을 수행
  • SecurityContext는 인증된 객체(Authentication)이 저장되는 객체

 

 

 

 

AuthenticationFilter

  • 인증을 담당하는 필터
  • 일반적으로 아이디/비밀번호를 이용해서 사용자 인증을 하기 때문에 AuthenticationFilter의 구현체 중에서 UsernamePasswordAuthenticationFilter가 처리한다

 

Authentication

  • 현재 접근하는 주체(사용자)의 정보와 권한을 표현하는 인터페이스
  • Authentication은 아래의 정보를 표현
    • Principal(접근주체) : 보호받는 리소스에 접근하려는 사용자
    • Credentail(비밀번호) : 접근주체의 비밀번호
    • Authority(권한) : 접근주체가 보유한 권한
  • UsernamePasswordAuthenticationToken은 Authentication 인터페이스의 구현체다
    • 아이디/비밀번호를 이용하는 사용자 인증에서 사용되는 Authentication 객체
    • 아아디/비밀번호를 이용하는 로그인 요청을 보내면 UsernamePasswordAuthenticationFilter가 실행되고, 이 필터가 UsernamePasswordAuthenticationToken을 생성한다
    • 이 객체에는 사용자가 로그인폼에서 입력한 아이디가 Principal에 비밀번호가 Credentail에 저장되어 있다

 

AuthenticationManager

  • 인증에 대한 부분은 AuthenticationManager를 통해서 처리한다
  • ProviderManger는 AuthenticationManager 인터페이스의 구현체다
  • 실질적인 인증처리는 ProviderManager에 등록된 AuthenticationProvider를 통해서 처리된다

 

AuthenticationProvider

  • 인증 전 Authentication객체를 전달받아서 인증작업을 수행하고, 인증 후 Authentication객체를 반환
  • 인증 작업에 필요한 정보를 UserDetailsService를 이용해서 데이터베에스에 조회한다
  • 조회한 사용자정보의 비밀번호와 인 증 Authentication에 저장된 비밀번호를 비교해서 인증작업을 수행한다

 

UserDetails

  • 사용자 정보를 표현하는 인터페이스다
  • UserDetails 인터페이스를 구현한 사용자 정의 UserDetails 클래스를 구현해야 한다
  • UserDetails 구현 클래스는 사용자이름, 비밀번호, 보유권한, 계정 잠금여부, 계정활성화 여부, 계정만료 여부, 계정비밀번호 만료여부와 같은 정보를 제공

 

UserDetailsService

  • 아이디를 전달받아서 사용자정보를 표현하는 UserDetails 객체를 반환하는 추상메소드가 정의된 인터페이스
  • 추상메소드 : UserDetails loadUserByUsername(String username)
  • 사용자정의 UserDetailsService 구현클래스를 작성해야 한다

 

 

 

 

 

각 번호별 동작하는 내용 정리 

 

1. 사용자는 아이디/비밀번호를 입력하고 로그인 요청을 서버로 보낸다

 

2. AuthenticationFilter는 로그인 요청을 받는다. 

AuthenticationFilter의 구현체인 UsernamePasswordAuthenticationFilter는

인증 전 Authentication 구현객체(UsernamePasswordAuthenticationToken)를 생성한다

인증 전 Authentication 객체에는 아래의 값이 저장된다

 

인증 전 Authentication 객체가 저장하는 값

principal = 사용자 아이디,  credential = 비밀번호, authenticated = false, authorities = null

 

 

3. AuthenticationFilter는 인증 전 Authentication 객체를 AuthenticationManager에게 전달해서 인증을 요청한다

4. AuthenticationManager는 구현체인 ProviderManager에 등록된 AuthenticationProvider에게

인증 전 Authentication 객체를 전달해서 인증처리를 맡긴다

 

 

6. AuthenticationProvider는 UserDetailsService의 loadUserByUsername(String username) 메소드를 실행해서 사용자 정보를 조회한다

7. 조회된 사용자정보는 UserDetails 객체를 생성해서 저장한다

8. AuthenticationProvider는 조회된 사용자정보가 담긴 UserDetails객체를 전달받고, 사용자 인증을 수행한다

(인증 전 Authentication 객체의 credential에 저장된 비밀번호와 조회된 사용자 정보가 표현된 UserDetails객체의 저장된 비밀번호를 비교한다 )

9. AuthenticationProvider는 인증이 완료되면 인증 후 Authentication 객체를 생성해서 AuthenticationManager에게 반환

 


인증 후 Authentication 객체

principal = UserDetails객체,  credential = 비밀번호, authenticated = true,
authorities = List<GeantedAuthority>객체

 

 

10. AuthenticationManager는 인증 후 Authentication 객체를 반환한다

11. SecurityContext에 인증 Authentication 객체를 저장한다