-
Notifications
You must be signed in to change notification settings - Fork 0
Description
Spring Security
Spring Security 란?
Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는
스프링 하위 프레임워크이다.
‘인증’과 ‘권한’에 대한 부분을 Filter 흐름에 따라 처리한다.
Filter는 Dispatcher Servler 으로 가기 전에 적용되므로,
가장 먼저 URL 요청을 받지만,
Interceptor는 Dispatcher와 Controller 사이에 위치한다는 점에서 적용 시기의 차이가 있다.
filter 와 interceptor의 순서는 다시 한 번 살펴보고 가자!
HTTP 요청 -> WAS -> **필터(여기에 Spring Securitiy가 있다!)** -> **서블릿** -> **스프링 인터셉터** -> 컨트롤러
[로그인 처리2 - 필터, 인터셉터 - 스프링 인터셉터 - 소개](https://www.notion.so/2-d6c33fb761354a25b0f0ba800c395942)
이 스프링 시큐리티를 사용하면 보안과 관련해서 많은 도움을 주므로,
개발자 입장에서 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다!
기본적으로 Spring Security 모듈을 설정하면
해당 프로젝트 서비스에 해당하는 도메인(url) 은 보안이 걸린다.
그래서, 어떤 url로 접근하더라도, account를 입력해야한다.
보안용어 - 인증 (Authorization)과 인가(Authentication)
- 인증
- 해당 사용자가 본인이 맞는지를 확인하는 절차
- 인가
- 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차
- Principal (접근 주체)
- 보호 받는 Resource에 접근하는 대상 (user)
- Credential (비밀번호)
- Resource에 접근하는 대상의 비밀번호
인증이 완료되야 인가가 이루어진다!
스프링 시큐리티도 마찬가지다.
인증을 먼저 거친 후, 인가를 거친다.
스프링 시큐리티는 이런 인증과 인가를 위해 Principal (접근 대상)을 아이디로,
Credential을 비밀번호로 사용하는 Credential 기반의 인증 방식을 사용한다.
Spring Security Architecture
인증 관련 아키텍쳐
아래는 Form 로그인에 대한 플로우 이다.
여기서는 전통적인 쿠키-세션 방식을 사용한다.
(JWT이런거는 spring-security-oauth2를..)
- 유저가 로그인을 시도 (http request)
- AuthenticationFilter 에서부터 위와같이 user DB까지 타고 들어감
- DB에 있는 유저라면 UserDetails 로 꺼내서 유저의 session 생성
- spring security의 인메모리 세션저장소인 SecurityContextHolder 에 저장
- 유저에게 session ID와 함께 응답을 내려줌
- 이후 요청에서는 요청쿠키에서 JSESSIONID를 까봐서 검증 후 유효하면 Authentication를 쥐어준다.
Spring Security 모듈
각 모듈에 관해서는 자료를 찾아보자.
큰 흐름
우선 톰캣부터 다시,
Tomcat은 서블릿 컨테이너라고도 부른다.
이 Tomcat은 다양한 필터와 서블릿으로 구성되어 있다.
그래서 클라이언트의 요청 HttpServletRequest를 쉽게 처리할 수 있도록 도와주고,
클라이언트의 응답 HttpServletResponse 을 쉽게 내보낼 수 있도록 도와준다.
이건 다 아는 사실이쥬?
웹 개발을 하하다 보면 Dispatcher Servlet (Front Controller) 하위에
Controller 부터 시작하는 흐름을 보통 많이 다루는데,
Spring Security는 필터 부분을 조작하게 된다.
위의 Tomcat 흐름 그림에서 Spring Security가 추가되면?!
이렇게 된다!
Spring Security 는 Tomcat 의 Filter에 해당한다.
Spring Security 역시 여러개의 Security Filter 구조로 되어있다.
이런 구조를 Filter Chain 이라고 한다.
Spring Security 의 필터 종류는 굉장히 다양하다.
당연히 다 외울 필요 1도 없고;;
그냥 순서가 중요하다는 것을 알면 된다.
실제로 필터의 순서는 중요하기 때문에 기본적인 필터들의 순서는 정해져있다.
또한 개발자가 임의로 필터를 생성해서 끼워넣을수도 있다.
겁나 복잡해 보이지만, 진짜 대충 느낌만이라도 알고 가자.
- LogoutFilter : logout 요청을 감시하며, 요청시 인증 주체(Principal)를 로그아웃 시킨다.
- UsernamePasswordAuthenticationFilter : login 요청을 감시하며, 인증 과정을 진행함.
- DefaultLoginPageGenerationFilter : 사용자가 별도의 로그인 페이지를 구현하지 않은 경우, 스프링에서 기본적으로 설정한 로그인 페이지로 넘어가게 한다.
필터 이름 길어 으악..
겁먹지 말고 필터 이름을 찬찬히 읽어보자.
생각보다 직관적이라 이건가?하면 그게 맞더라.
보통은 이런 Spring Security 는 URL 에 따라 다르게 처리할 수 있다.
예를 들어, /user 와 /admin 으로 클라이언트의 Requset 가 나뉜다면??
다음 그림처럼 해보자.
그림을 잘 보면 /user 요청과 /admin 요청을 별도로 처리하는 것을 알 수 있다.
반면에 정적 Resource는 걍 Security 가 없어도 되니, Security 필터 체인을 무시하고 통과시켜 줄 수도 있겠다.
ref
https://mangkyu.tistory.com/76
[https://www.bottlehs.com/springboot/스프링-부트-spring-security를-활용한-인증-및-권한부여/](https://www.bottlehs.com/springboot/%EC%8A%A4%ED%94%84%EB%A7%81-%EB%B6%80%ED%8A%B8-spring-security%EB%A5%BC-%ED%99%9C%EC%9A%A9%ED%95%9C-%EC%9D%B8%EC%A6%9D-%EB%B0%8F-%EA%B6%8C%ED%95%9C%EB%B6%80%EC%97%AC/)



