범위 8장 - 스프링 시큐리티로 로그인/로그아웃, 회원가입 구현하기

 

인증/인가

인증 : 로그인을 할 때 누구인지 확인하는 과정과 같이 사용자의 신원을 확인하는 과정

인가 : 특정 페이지를 사용자가 들어갈 수 있는지 없는지를 판단하는 작업

 

필터 

- 필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공하는 기능.

- 각각의 필터는 단일 필터 단일 책임 원칙처럼 각기 서로 다른 관심사를 해결한다.

- 주로 요청에 대한 인증, 권한 체크 등을 하는데에 쓰인다.

- 들어온 요청이 DispatcherServlet에 전달되기 전에 헤더를 검사해서 인증 토큰의 유무, 올바른지 등을 검사

 

필터 체인

- 여러 필터가 연쇄적으로 동작하는 것

 

 

 

스프링 시큐리티

- 인증과 인가를 쉽게 처리할 수 있는 스프링 하위 프레임워크

- 보안 관련 옵션을 많이 제공한다.

- CSRF공격(사용자의 권한을 가지고 특정 동작을 수행하도록 유도하는 공겨), 세션 고정 공격(사용자의 인증 정보를 탈취하거나 변조하는    공격)을 방어

- 요청 헤더도 보안 처리를 해주어서 보안 관련 개발을 해야하는 부담을 줄여준다.

 

스프링 시큐리티의 동작

- 다양한 필터들로 나누어져있으며, 각 필터에서 인증, 인가와 관련된 작업을 처리하는 필터 기반 동작

- SecurityFilterChain이 맨 위부터 아래로 내려가며 순서대로 필터를 거친다 (변경할 수는 있지만 제대로 동작 안 할 수 있음)

- 필터를 실행할 때에는 인증과 인과 클래스를 거치며 수행한다. 

출처:스프링 부트3로 블로그 제대로 만들기

 

- 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://velog.io/@couchcoding/Spring-Security%EC%99%80-Spring-Security-%EC%84%A4%EC%A0%95-%EB%B0%A9%EB%B2%95%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90

 

Spring Security (1) - 구조와 동작 방식

Spring Security는 Spring Application 개발시에 보안을 적용하기 위해 사용하는 보안 프레임워크 입니다. Spring Security는 웹 보안을 위하여 인증 및 보안 관련 로직을 제공합니다. 특히 Spring Security의 가장

velog.io

 

https://gardeny.tistory.com/35

 

spring - 스프링에서의 필터 개념 및 예제

블로그에서 사용한 소스코드는 https://github.com/97e57e/BLOG 에서 보실 수 있습니다. Filter 란? 사실 필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공하는 기능입니다. 스프링 프레임워크

gardeny.tistory.com

https://velog.io/@seculoper235/Spring-Core-Context-1%ED%8E%B8

 

Spring Core - Context 1편

이 Context는 설명할 것이 매우 많고 복잡하다.3편으로 나눠서 진행하며, 이번 편에서는 Context란 무엇이고, 어떤 종류가 있는지만 알아볼 것이다.Bean의 확장 버전으로, Spring이 Bean을 좀 더 다루기

velog.io

https://velog.io/@dnrwhddk1/Spring-Security-Filter

 

[Spring Security] Filter

[Spring Security] Filter

velog.io

https://itstory.tk/entry/CSRF-%EA%B3%B5%EA%B2%A9%EC%9D%B4%EB%9E%80-%EA%B7%B8%EB%A6%AC%EA%B3%A0-CSRF-%EB%B0%A9%EC%96%B4-%EB%B0%A9%EB%B2%95

 

CSRF 공격이란? 그리고 CSRF 방어 방법

CSRF 공격(Cross Site Request Forgery)은 웹 어플리케이션 취약점 중 하나로 인터넷 사용자(희생자)가 자신의 의지와는 무관하게 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게

itstory.tk

https://code-lab1.tistory.com/210

 

[Web] 서블릿(Servlet)이란? 서블릿 컨테이너란?

서블릿(Servlet)이란? 자바 서블릿(Java Servlet)은 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. -위키피디아- 서블릿은 웹 서버의 성능을 향상

code-lab1.tistory.com