본문 바로가기

Spring/웹

Spring Security

Spring Security란?

Spring 기반의 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크

Spring 기반 애플리케이션의 보안에서는 사실상의 표준

보안의 3요소

1. 접근 주체(Principal) : 보호된 대상에 접근하는 사용자  
2. 인증(Authenticate) : 현재 사용자가 누군인지 확인하는 과정, 일반적으로 아이디/암호를 이용해 인증 처리  
3. 인가(Authorize) : 현재 사용자가 특정 URL, 기능 등의 접근 권한 여부 검사

 


1) 인증과 인가

Spring Security는 크게 인증 -> 인가 절차로 진행한다.

이러한 인증과 인가를 위해 Principal _(보호된 대상에 접근하는 사용자)_을 ID로, Credential _(대상에 접근하는 사용자의 비밀번호)_을 비밀번호로 사용하는Credential 기반의 인증 방식을 사용한다.

인증의 종류

1. Credential(자격) 기반 인증: 웹 대부분의 인증 방식은 Credential 기반. 
권한을 부여받는데 1차례의 인증과정이 필요
대개 사용자명과 비밀번호를 입력받아 입력한 비밀번호가 저장된 비밀번호와 일치하는지 확인.

2, Two-factor authentication(이중 인증): 한번에 2가지 방식으로 인증을 받는 것. 
예를 들어 금융, 은행 웹 어플리케이션 이용 시, 로그인과 인증서 2가지 방법으로 인증을 받는 경우.

3. 물리적인 인증 : 웹의 영역을 벗어난 것이지만 가장 효과적인 보안 수단 중에 하나. 
예를 들어 컴퓨터를 킬 때 지문을 인식받는다거나 키를 삽입해야 하는 경우
인가의 과정

1. Granted Autority(부여된 권한) : 회원가입 등을 통해 반영구적인 권한이 부여됐다면 
이 회원에게 부여된 권한을 어딘가에 저장해야 함. 

2. Intercept(리소스 권한) : 적절한 권한을 가진자만 해당 자원에 접근할 수 있도록 
자원의 외부요청을 원천적으로 Intercept

2) 인증과정

[자세한 과정]

1 사용자가 form을 통해 로그인 정보가 담긴 Request를 보내면,
AuthenticationFilter가 HttpServletRequest에서 사용자가 보낸 ID/PW를 인터셉트 
2 HttpServletRequest에서 꺼내온 ID/PW를 인증용 객체(UsernamePasswordAuthenticationToken)로 만들어 전달
3 진짜 인증을 담당하는 AuthenticationManager(구현체 - ProviderManager)에게 Authentication객체 (UsernamePasswordAuthenticationToken)을 전달
4 인증 절차가 시작되면 AuthenticationProvider 인터페이스 실행 (DB와 ID/PW를 비교)
이 때, authenticate() 메소드를 오버라이딩 하게 되는데 이 메소드의 파라미터인 Authentication으로 화면에서 입력한 로그인 정보를 가져올 수 있다.
5~7 UserDetailsService 인터페이스는 로그인 정보를 토대로 메소드를 호출하여 DB에 있는 이용자의 정보를 UserDetails형으로 가져온다.
8~9 쭉 반환 시켜준다.
10 인증이 완료되면 사용자 정보를 가진 Authentication 객체를 SecurityContextHolder에 담아 AuthenticationSuccessHandler (성공) or AuthenticationFailureHandler(실패)를 실행

 

좀 더 직관적으로 설명된 이미지가 있어 첨부하였다.

 


3) Spring Security Filter

spring Security는 다음과 같이 여러 필터들이 서로 연결되어 인증/인가를 처리한다.

이를 chain과 같이 엮어져있다고 하여 Spring Security Filter Chain이라고 부른다. 

SecurityContext
PersistenceFilter
Request전에, SecurityContextRepository에서 받아온 정보를 SecurityContextHolder에 주입
LogoutFilter 로그아웃 URL에 대한 요청을 감시하여 사용자를 로그아웃시킴
UsernamePassword
AuthenticationFilter
폼기반 인증에 사용하는 URL요청을 감시하여 사용자의 인증 진행
DefaultLoginPage
GeneratingFilter
사용자가 별도의 로그인 페이지를 구현하지 않은 경우,
스프링에서 기본적으로 설정한 로그인 페이지를 처리
BasicAuthenticationFilter HTTP 기본 인증 헤더를 감시하고 결과를 SecurityContextHolder에 저장
Anonymous
AuthenticationFilter
SecurityContextHolder에 인증(Authentication) 객체가 있는지 확인하고,
필요한 경우 Authentication 객체를 주입
SessionManagementFilter 요청이 시작된 이 후 인증된 사용자 인지 확인하고,
인증된 사용자일 경우, SessionAuthenticationStrategy를 호출하여 세션 고정 보호 메커니즘을 활성화하거나 여러 동시 로그인을 확인하는 것과 같은 세션 관련 활동을 수행
ExceptionTranslationFilter 필터 체인 내에서 발생(Throw)되는
모든 예외(AccessDeniedException, AuthenticationException)를 처리합니다.
FilterSecurityInterceptor 이 필터는 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해
권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌
출처: https://devuna.tistory.com/55 / siyoon210.tistory.com/32 

 

 

 

 

공부 진행 중

velog.io/@hellas4/Security-%EA%B8%B0%EB%B3%B8-%EC%9B%90%EB%A6%AC-%ED%8C%8C%EC%95%85%ED%95%98%EA%B8%B0-%EC%9D%B4%EB%A1%A0%ED%8E%B8

egloos.zum.com/springmvc/v/504862

dingue.tistory.com/5

mangkyu.tistory.com/76

www.slideshare.net/madvirus/ss-36809454

'Spring > ' 카테고리의 다른 글

Container란? (Servlet / Spring Container)  (0) 2021.04.03
Lombok의 좋은 사용법  (3) 2021.03.29
AOP란? (Spring AOP)  (0) 2021.03.26
Web Server vs Web Application Server  (0) 2021.01.24
Spring MVC 패턴을 이용한 Java 웹크롤러  (0) 2020.06.20