본문 바로가기
Java

스프링 시큐리티란? : 인증, 인가, 방식, 필터, 동작원리

by yapdol 2023. 9. 3.

 

 

 

 

✅ 스프링 시큐리티(Spring Security) 란?

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

- 보안 관련 많은 옵션 제공, 애너테이션 설정이 쉬움 → 개발자의 보안관련 로직 작성 부담 감소.

   ( *CSRF 공격 / *세션 고정 공격 방어 / 요청 헤더 보안 처리 제공 )

- 주로 서블릿 필터와, 서블릿 필터로 구성된 필터체인으로 구성된 위임 모델 사용.

   (인증과 권한에 대한 부분을 필터의 흐름에 따라 처리.)

 

* CSRF 공격 : 사용자 권한을 가지고 특정 동작을 수행하도록 유도하는 공격.

* 세션 고정 공격 : 사용자 인증 정보 탈취/변조 하는 공격.

 

 

 

✅ 인증 & 인가 (Authentication & Authorization),  접근 주체 & 비밀번호 (Principal & Credential )

: Spring Security 에서는 인증 절차를 거친 , 인가 절차를 실행한다.

  인증/인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 Credential 기반 인증 방식을 사용한다.

인증 (Authentication) → (인증 성공 후)  인가(Authorization)

 

📌 인증 (Authentication)

: 사용자의 신원 입증. 누구인지 확인하는 절차. (ex. 로그인)

- 식별 가능한 정보(이름, 이메일 등)으로 서비스에 등록된 유저의 신원을 입증하는 과정.

📌 인가 (Authorization)

: 사용자의 권한 확인. 사이트의 특정 부분/자원에 접근 가능한지 권한 확인하는 절차 (ex. 관리자 페이지)

- 인가 앞에 항상 인증이 선행되어야 한다.

📌 접근 주체 (Principal)

: 보호받는 자원(Resource)에 접근하는 대상 (ex. 아이디)

📌 비밀번호 (Credential)

: 자원(Resource)에 접근하는 대상의 비밀번호

 

 

⭐ 인증 vs 인가 (비교)

  인증 (Authentication) 인가 (Authorization)
기능 신원 입증 권한 허가/거부
진행방식 비밀번호, 생체인식 보안팀 설정 사용
사용자가 볼 수 있는가? O X
사용자가 변경 가능한가? △ (부분적 가능) X
데이터 전송 Id 토큰 사용 엑세스 토큰 사용

 

 

 

✅ 필터 & 필터 체인

📌 필터 체인 (Filter Chain)

: 스프링 시큐리티다양한 필터들로 나누어져 있으며, 각 필터에서 인증/인가와 관련된 작업을 처리한다. 

  이러한 필터는 체인처럼 연결되어 있기 때문에 필터체인이라고 불린다.

- 특정 필터 제거 / 커스텀 필터 추가 가능.

 

이미지 출처 :  http://atin.tistory.com/590

 

📌 필터 종류 / 실행 순서

실행순서 필터명 설명
1 SecutiryContext
PersistenceFiter
SecutiryContext (접근 주체 & 인증에 대한 정보를 담은 객체)를
조회/저장.
2 LogoutFilter 설정된 로그아웃 URL로 오는 요청을 확인해 사용자 로그아웃 처리.
3 UsernamePassword
AuthenticationFilter
인증 관리자
:아이디/비번
이 넘어오면 인증 요청 위임
- 폼 기반 로그인 시 사용되는 필터.

- 아이디/패스워드 데이터를 파싱해 인증 요청 위임.
- 인증 성공 시, AuthenticaitonSuccessHandler 실행.
- 인증 실패 시, AuthenticationFailureHandler 실행.
4 DefaultLoginPage
GenerationFilter
사용자가 로그인 페이지를 따로 지정하지 않았을 때,
기본으로 설정하는 로그인 페이지 관련 필터.
5 BasicAuthenticationFilter 요청 헤더에 있는 아이디/비번 파싱 → 인증 요청 위임
- 인증 성공 시, AuthenticaitonSuccessHandler 실행.
- 인증 실패 시, AuthenticationFailureHandler 실행.
6 RequestCacheAwareFilter 로그인 성공 후, 관련 있는 캐시 요청 확인/처리
ex) 로그인 X 상태로 방문했던 페이지를 기억해뒀다가,
로그인 이후 해당 페이지로 이동시켜줌.
7 SecurityContext
HolderAware
RequsetFilter
HttpServletRequest 정보를 감쌈.
: 필터 체인 상, 다음 필터에게 부가 정보 제공을 위해 사용됨.
8 AnonymousAuthentication
Filter
필터 호출 시점까지 인증 X 시,
AnonymousAuthentication(익명 사용자 전용 객체)를 만들어
SecurityContext에 넣어줌.
9 SessionManagementFilter 인증된 사용자와 관련된 세션 관리 작업 진행.
- 세션 변조 방지 전략 설정.
- 유효하지 않은 세션 처리.
- 세션 생략 전략 설정 등.
10 ExceptionTranslationFilter 요청 처리 중 발생 가능한 예외 위임/전달.
11 FilterSecurity
Interceptor
접근 결정 관리자
: 권한 부여 처리를 위해 접근 제어 결정을 쉽게함.
- AccessDecisionManager로 권한 부여 처리를 위임함으로써 
  접근 제어 결정을 쉡게 해줌.
- 이미 사용자가 인증되었으므로 인가 관련 설정 가능.

 

 

 

 

 

✅ Spring Security  내부 구조

 

이미치출처 : https://velog.io/@mooh2jj

 

1. SecurityContextHolder 
SecurityContext를 제공하는 static 메서드(getContext)를 지원함.

2. SecutiryContext 
접근 주체와 인증에 대한 정보를 담고 있는 객체.
즉, Authentication을 담고 있음.

3. Authentication 
Principal 과 GrantAuthority 제공.
인증 완료 시, 해당 Authentication 저장.

4. Principal 
유저 정보.
대부분의 경우 UserDetails를 Principal 로 반환

5. GrantAuthority 
Principal 이 가진 권한(ROLE_ADMIN, ROLE_USER 등)을 나타냄.
- 인가 시, 권한이 여러개일 수 있기 때문에, prefix(접두사)로 'ROLE_'이 붙는다.
  (ex) ROLE_DEVELOPER, ROLE_ADMIN)

 

 

 

 

✅ Spring Security 인증 처리 과정 ( 아이디/패스워드 기반 폼 로그인 )

 

이미치출처 : https://velog.io/@mooh2jj

 

 

1. 사용자가 폼에 아이디/패스워드 입력 시(HTTP 요청 시),  
   HTTPServletRequest에 아이디/패스워드 정보
전달됨.   
   이때, AuthenticationFilter가 넘어온 아이디/패스워드의 유효성 검사를 함.

2. 유효성 검사 후, UsernamePasswordAuthenticaitonToken (이하 Token) 을 생성해 넘겨줌.
   (Authenticaiton 인터페이스의 실제 구현체)


3. 인증용 객체인 Token 을 AuthenticationManager 에게 보내,
    해당 토큰이 올바른 유저인지 물어봄.

4. Token을 AuthenticationProvider 에게 보냄.
  - AuthenticationManager 는 1개 이상의 AuthenticationProvider 를 갖고있다.
  -  AuthenticationProvider 는 Token 객체를 적절히 판단해 인증 처리를 한다.

5.  아이디를 UserDetailService에 보냄.
- UserDetailService는 아이디로 찾은 유저 정보UserDetails 객체를 만들고, 이를 AthenticcationProvider 에게 전달.

6. DB에 있는 유저 정보를 가져옴.

7. 입력 정보UserDetails의 정보 비교를 통해, 실제 인증 처리

8~10. 8~10까지 인증이 완료되면, SecurityContextHolder 에 Authentication 저장
       - 인증 성공 시, AuthenticaitonSuccessHandler 실행.
       - 인증 실패 시, AuthenticationFailureHandler 실행.

 

 

 

 

 

 

 

 

🌈 오늘 배운것 요약 정리 🌈

용어 설명
스프링 시큐리티
(Spring Security)
보안(인증, 인가 등)을 담당하는 스프링 하위 프레임워크
인증 (Authenticaiton) 유저의 신원을 확인/입증하는 절차
인가 (Authorization) 인증된 사용자가 요청한 자원(Resource)에 접근 가능한지 결정하는 절차
접근주체 (Principal) 보호받는 자원(Resource)에 접근하는 대상
비밀번호 (Credential) 자원(Resource)에 접근하는 대상의 비밀번호
필터 체인 (Fitler Chain) 스프링 시큐리티의 각 필터에서는 인증/인가에 대한 처리를 하는데,  이러한 필터들이 체인처럼 엮여있기 때문에 필터 체인이라 부름.

 

회원가입/로그인/로그아웃 기능 구현에 앞서,

스프링 시큐리티의 기본 개념과 용어, 폼 로그인 인증의 내부 동작의 흐름을

공부하고 이해한 내용을 토대로 정리해보았다.

실제 기능 구현 시, 스프링 시큐리티를 더 잘 이해하고 활용할 수 있을 것 같다!

 

 

 

 

 

 

 

참고자료 :

https://ik0501.tistory.com/entry/Spring-%EC%9D%B8%EC%A6%9D-%EC%9D%B8%EA%B0%80-%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8B%9C%ED%81%90%EB%A6%AC%ED%8B%B0

https://k3068.tistory.com/88

https://wildeveloperetrain.tistory.com/50

https://dev-coco.tistory.com/174

http://atin.tistory.com/590

https://velog.io/@mooh2jj/Security-%EC%9D%B8%EC%A6%9D%EC%9D%B8%EA%B0%80%EC%B2%98%EB%A6%AC

 

스프링 부트 3 백엔드 개발자 되기: 자바 편

https://product.kyobobook.co.kr/detail/S000201766024

 

스프링 부트 3 백엔드 개발자 되기: 자바 편 | 신선영 - 교보문고

스프링 부트 3 백엔드 개발자 되기: 자바 편 | ★ 자바 백엔드 개발자가 되고 싶다면 ★ 자바 언어 입문 그다음에 꼭 보세요실력을 갖춘 개발자로 성장하려면 시작이 중요합니다. 그래서 이 책은

product.kyobobook.co.kr