반응형
스프링 시큐리티란?
스프링 시큐리티: 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크
스프링 시큐리티를 이해하려면 인증과 인가에 대한 개념을 알아야한다.
인증과 인가
인증 : 사용자의 신원을 입증하는 과정
예를 들어 사용자가 사이트에 로그인할 때, 누구인지 확인하는 과정이다.
인가: 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업
예를 들어 관리자는 관리자 페이지에 들어갈 수 있지만, 일반 사용자는 관리자 페이지에 들어갈 수 없다.
인증과 인가 관련 코드를 아무런 도구의 도움 없이 작성하려면 굉장히 많은 시간이 소요되지만,
스프링 시큐리티를 사용하면 아주 쉽게 처리할 수 있다.
스프링 시큐리티
스프링 시큐리티 : 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임 워크이다.
◆ 스프링 시큐리티의 특징
- 보안 관련 옵션 제공
- 애너테이션 설정이 쉬움
- CSRF (사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공격), 세션 고정 공격 방어
- 요청 헤더 보안 처리
◆ 필터 기반으로 동작하는 스프링 시큐리티
스프링 시큐리티는 필터 기반으로 동작한다.
위와 같이 다양한 필터들로 나누어져 있으며, 각 필터에는 인증, 인가와 관련된 작업을 처리한다.
SecurityContextPersistenceFilter부터 시작해서 아래로 내려가며 FilterSecurityInterceptor까지 순서대로 필터를 거친다.
필터를 실행할 때는 회색 화살표로 연결된 오른쪽 박스의 클래스를 거치며 실행한다.
특정 필터를 제거하거나 필터 뒤에 커스텀 필터를 넣는 등의 설정도 가능하다.
주요 filter
- UsernamePasswordAuthenticationFilter
아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자의 역할을 한다. - FilterSecurityInterceptor
권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 한다.
이외의 filter들
◆ 아이디/패스워드 로그인 시 스프링 시큐리티 동작 방식
아이디와 패스워드 기반 폼 로그인을 시도하면 스프링 시큐리티에서는 어떤 절차로 인증 처리를 하는지 알아보자.
- HTTP 요청
사용자가 폼에 아이디와 패스워드를 입력하면,
HTTPServletRequest에 아이디와 비밀번호 정보가 전달된다.
이때 AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 한다. - UsernamePasswordAuthenticationToken 만들기
유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다. - 인증용 객체 전송
전달 받은 인증용 객체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다. - UsernamePasswordAuthenticationToken을 AuthenticationProvider에게 전송
- 사용자 아이디 전송
사용자 아이디를 UserDetailService에 보낸다.
UserDetailService는 사용자 아이디로 찾은 사용자의 정보를
UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다. - DB에 있는 사용자의 정보를 가져온다.
- 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 한다.
- 8~10까지 인증 완료 시
SecurityContextHolder에 Authentication을 저장한다.
인증 성공 여부에 따라 성공하면 AuthenticationSuccessHandler,
실패하면 AuthenticationFailureHandler 핸들러를 실행한다.
출처:https://github.com/shinsunyoung/springboot-developer
반응형
'Java & Kotlin > Spring' 카테고리의 다른 글
[스프링 부트 3] JWT - 1 (토큰 기반 인증, JWT, 액세스 토큰, 리프레시 토큰) (0) | 2024.08.18 |
---|---|
[스프링 부트 3] 스프링 시큐리티 - 2 (로그인/로그아웃, 회원가입 구현하기) (0) | 2024.08.16 |
[스프링 부트 3] 블로그 만들기 - 3 (타임리프를 활용하여 블로그 뷰 구현하기) (0) | 2024.08.12 |
[스프링 부트 3] 템플릿 엔진, 타임리프란? (0) | 2024.08.12 |
[스프링 부트 3] 블로그 만들기 - 2 (글 목록 조회 / 단일 조회 / 삭제 / 수정 API 구현) (0) | 2024.08.08 |