범위 8장 - 스프링 시큐리티로 로그인/로그아웃, 회원가입 구현하기
인증/인가
인증 : 로그인을 할 때 누구인지 확인하는 과정과 같이 사용자의 신원을 확인하는 과정
인가 : 특정 페이지를 사용자가 들어갈 수 있는지 없는지를 판단하는 작업
필터
- 필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공하는 기능.
- 각각의 필터는 단일 필터 단일 책임 원칙처럼 각기 서로 다른 관심사를 해결한다.
- 주로 요청에 대한 인증, 권한 체크 등을 하는데에 쓰인다.
- 들어온 요청이 DispatcherServlet에 전달되기 전에 헤더를 검사해서 인증 토큰의 유무, 올바른지 등을 검사
필터 체인
- 여러 필터가 연쇄적으로 동작하는 것
스프링 시큐리티
- 인증과 인가를 쉽게 처리할 수 있는 스프링 하위 프레임워크
- 보안 관련 옵션을 많이 제공한다.
- CSRF공격(사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공겨), 세션 고정 공격(사용자의 인증 정보를 탈취하거나 변조하는 공격)을 방어
- 요청 헤더도 보안 처리를 해주어서 보안 관련 개발을 해야하는 부담을 줄여준다.
스프링 시큐리티의 동작
- 다양한 필터들로 나누어져있으며, 각 필터에서 인증, 인가와 관련된 작업을 처리하는 필터 기반 동작
- SecurityFilterChain이 맨 위부터 아래로 내려가며 순서대로 필터를 거친다 (변경할 수는 있지만 제대로 동작 안 할 수 있음)
- 필터를 실행할 때에는 인증과 인과 클래스를 거치며 수행한다.
- UsernamePasswordAuthenticationFilter: 요청에서 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 관리자 역할
- FilterSecurityInterceptor: 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할
스프링 시큐리티 로그인 로직
1. http요청으로 사용자가 입력한 아이디와 패스워드가 넘어온다.
2. AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 한다.
3. UsernamePasswordAuthenticationToken을 만들어 그 안에 아이디와 패스워드를 넣고 AuthenticationManager에게 보낸다.
4. AuthenticationManager가 전달받은 토큰을 다시 AuthenticationProvider에 보낸다.
5. AuthenticationProvider는 사용자의 아이디를 UserDetailService에 보내면 아이디로 사용자의 정보를 찾아 UserDetails객체로
만들고 다시 AuthenticationProvider에게 보낸다.
6. 입력된 정보와 DB에 있는 UserDetails를 비교하여 실제 인증 처리를 한다.
7. 인증이 완료되면 SecurityContextHolder에 Authentication을 저장한다.
8. 인증이 성공하면 AuthenticationSuccessHandler를, 실패하면 AuthenticationFailureHandler를 실행한다.
간단하게 축약하면 아이디와 비밀번호를 넣어서 폼을 보내면 유효성 검사를 하고, 토큰에 아이디와 비밀번호를 태워 보낸다.
그럼 그 아이디의 정보로 DB에 있는 계정정보와 비교하여 인증을 처리한 다음 Authentication을 저장하고 성공/실패에 따라 handler를 실행한다.
스프링 시큐리티 설정
(1) 스프링 시큐리티 기능 비활성화
- web.ignoring().requestMachers() 를 통해 시큐리티 기능을 원하지 않는 기능이나 페이지를 지정할 수있다.
- 일반적으로 정적리소스에 설정한다.
(2) 특정 HTTP요청에 대한 웹 기반 보안 구성
- 인증/인가 및 로그인, 로그아웃 관련 설정이 가능
- 특정 경로에 대한 엑세스 설정 가능
- 폼 기반 로그인 서정
- 로그아웃 설정
- CSRF 설정
(3) 인증 관리자 관련 설정
- 인증 관리자 관련 설정: 사용자 정보를 가져올 서비스를 재정의하거나 인증방법 등을 설정
- 사용자 서비스 설정
(4) 패스워드 인코더로 사용할 빈 등록
- 패스워드 인코더를 빈으로 등록 => 패스워드를 암호화 할 수 있다.
-----------------------------------------------------------------------------------------------------------------
정확히 몰랐던 개념
CSRF 공격 (Cross Site Request Forgery)
- 웹 어플리케이션 취약점 중 하나로 인터넷 사용자가 자신의 의지와 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트 에 요청하게 만드는 공격
(이 포스팅에서 쉽게 설명되어있다!!!!! https://tlatmsrud.tistory.com/77)
Spring Context
- Bean의 확장 버전
- Bean들을 포함하여 여러 기능을 가진 공간
- 공통부분(ROOT-Context)과 개별부분(Servlet-Context)이 있다
공통 부분: 모든 서블릿이 공유할 수 있는 Bean들이 모인 공간
개별 부분: 서블릿 각자의 Bean들이 모인 공간
Servlet
- 클라이언트의 요청에 맞추어 동적인 결과를 만들어주는 자바 웹 프로그래밍 기술
- WAS 내의 서블릿 컨테이너에서 동작하며, 요청을 받으면 요청에 맞는 로직을 실행하고 클라이언트에게 HTTP형식으로 응답한다.
-----------------------------------------------------------------------------------------------------------------
참고
https://gardeny.tistory.com/35
https://velog.io/@seculoper235/Spring-Core-Context-1%ED%8E%B8
https://velog.io/@dnrwhddk1/Spring-Security-Filter
https://code-lab1.tistory.com/210
'묘공단 스프링부트 스터디' 카테고리의 다른 글
묘공단 스프링부트 스터디 6주차 (0) | 2023.12.12 |
---|---|
묘공단 스프링부트 스터디 5주차 (2) (0) | 2023.12.06 |
묘공단 스프링부트 스터디 4주차 (1) | 2023.11.27 |
묘공단 스프링부트 스터디 3주차 (2) | 2023.11.23 |
묘공단 스프링부트 스터디 2주차 (1) | 2023.11.15 |