티스토리 뷰
※Spring Boot Security란
-
스프링 기반의 애플리케이션의 보안(인증과 권한처리, 인가 등)을 담당하는 스프링 하위 프레임워크
-
스프링 부트 시큐리티는 스프링 시큐리티의 번거로운 설정을 간소화 시켜주는 래핑 프레임워크
-
스프링 부트에서는 스프링 시큐리티를 스터터로 제공함
-
위와 같이 빌드도구에 의존성만 추가해주면 별도의 설정이 없더라도 스프링 시큐리티가 바로 적용됨 (xml설정이 전혀 필요하지 않아 편리함)
Spring Security의 보안 요소
1. 인증 (Authentication)
- 사용자(클라이언트)가 애플리케이션의 특정 동작에 관하여 허락된 사용자인지 확인하는 절차 (ex. 로그인)
2. 인가 (Authorize)
- 현재 사용자가 서버의 특정 자원을 사용(접근)할 권한이 있는지 검사하는 것
3. 권한 부여 (Authorization)
- 특정 자원이나 서비스에 접근할 수 있도록 권한을 허용하는 것
4. 접근 주체 (Principal)
- 보호된 대상에 접근하는 사용자
Spring security 와 보안 요소의 매칭
Spring Boot Security의 인증처리 절차
-
클라이언트는 id와 password 값을 입력하여 서버로 인증 요청을 보낸다.
-
스프링 시큐리티는 여러개의 필터들의 체인으로 구성되어있는데 그 중 인증필터(UserNamePasswordAuthenticationFilter)에서 클라이언트로부터 받은 id와 password가 담긴 Authentication 객체를 생성한다.
-
AuthenticationManger는 AuthenticationProvider로 AuthenticationProvider는 DaoAuthenticationProvider로 Authentication 객체를 전달한다. (DB 데이터를 이용한 Credential 인증 방식일 경우)
-
DaoAuthenticationProvider는 Authentication에 담긴 id값을 매개변수로 하여 UserDetailsService 인터페이스를 구현한 클래스에서 오버라이딩한 loadUserByUserName() 메서드를 호출한다.
-
loadUserByUserName() 메서드는 매개변수로 전달받은 id값을 이용하여 DB에 접근하고 DB에 저장된 유저 정보를 얻는다. (만약 유저정보가 DB에 없다면 직접 Exception 발생 시키도록 개발)
-
DB로부터 얻어온 유저정보(id, password, authorities)를 이용하여 스프링 시큐리티에서 지원하는 UserDetails(인증 과정에 필요할법한 정보들을 추상화한 인터페이스) 객체를 만들어 반환한다.
-
DaoAuthenticationProvider는 반환받은 UserDetails 객체의 비밀번호와 기존의 Authentication 객체에 있던 비밀번호를 비교하여 같다면 인증을 성공시키고, 다르면 인증을 실패시킴(Bad Credentials 예외 발생)
-
인증이 성공하면 Authentication 객체에 유저의 principal 정보가 담긴다.
-
Authentication 객체는 SecurityContext 내에 저장되어 관리되고 SecurityContextHolder 내에서 SecurityContext가 관리된다. SecurityContextHolder는 기본적으로 *ThreadLocal에 의해 관리된다.
-
또한, 인증처리가 성공하면 SPRING_SECURITY_CONTEXT 라는 속성으로 세션에 인증 정보가 추가된다.
-
인증 성공 시 SuccessHandler가 호출되어 성공 로직을 작성할 수 있으며, 인증 실패 시 FailureHandler가 호출되어 실패 로직을 작성할 수 있다.
-
만약 다음 요청이 인증처리가 요구되는 요청이라면 먼저 세션에 인증정보가 있는지 확인하고 있다면 인증처리 로직을 생략, 없다면 인증처리 로직 수행하는 방식으로 동작함
※ ThreadLocal 이란?
- 스레드 내의 데이터 저장소
- 같은 스레드 내에서 공유가능
- 같은 스레드라면 메서드의 파라미터로 넘겨줄 필요 없이 어느 곳에서나 사용 가능 (공유)
- 싱글톤으로 빈을 관리하는 스프링 환경에서 모든 요청마다 공유되는 값이 아닌 각 요청마다 유일한 값을 저장
하여 사용하고 싶을때 주로사용
- 단, 스프링에서 스레드 또한 스레드 풀내에서 관리되는 공유자원이므로 한번 사용하면 종료되기 전에
초기화 시켜줘야 함
Spring boot security를 이용한 인증처리 구현코드
'웹 개발 > SpringBoot' 카테고리의 다른 글
JPA에 대해서 (0) | 2019.11.10 |
---|---|
스프링 부트 프로젝트에 Git-flow 적용해보기 (0) | 2019.04.30 |
소스트리를 이용하여 github에 스프링부트 프로젝트 올리기 (0) | 2019.04.29 |
인텔리제이에서 스프링 부트 프로젝트 생성하기 (0) | 2019.04.29 |
- Total
- Today
- Yesterday
- 상속
- 클래스
- connectionless
- AJAX
- 가상 회선 방식
- 스프링부트
- 유효성검사
- 스프링
- 싱글톤 레지스트리
- 웹 서버
- github
- 람다식
- stateless
- 포워드 프록시
- git
- 객체
- 리버스 프록시
- jvm
- http
- 인텔리제이
- Servlet
- 그래프 순회 알고리즘
- 제네릭 메서드
- 전자정부프레임워크
- JVM 메모리 구조
- 멀티 프로세스
- 회원가입
- 스프링 부트 시큐리티
- 메서드 참조
- 자바의 정석
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |