Spring security

최강일·2022년 3월 19일
0

Spring boot

목록 보기
4/7

Spring Security

스프링 기반의 어플리케이션 보안을 담당하는 프레임워크(인증,권한,인가 등 많은 기능 제공)
'인증'과 '권한'에 대한 부분을 Filter 흐름에 따라 처리

인증(Authentication): 해당 사용자가 본인이 맞는지를 확인하는 절차
인가(Authorization): 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차

동작방식

1.client가 아이디,비밀번호로 로그인 요청
브라우저에서 사용자가 아이디와 비밀번호를 입력하고 요청을 보냄

2.사용자 자격 증명을 기반으로 토큰 생성
인증담당 필터인 AuthenticationFilter는 사용자의 요청을 가로챈다. 그리고 인증이 필요한 요청이라면 사용자의 JSESSIONID가 Security Context에 있는지 확인한다.
없으면 로그인 페이지에서 입력받은 username과 password를 이용해 UsernamePasswordAuthenticationToken을 만든다. 그리고 유효한 계정인지 판단하기 위해 AuthenticationManager로 전달한다.

3.Authentication Manager에게 처리 위임
AuthenticationManager 인터페이스의 구현체는 ProviderManger이고 List형태로 Provider들을 갖고 있다.

4.Token을 처리할 수 있는 Authentication Provider 선택

5~7.비밀번호 인증 로직 수행
UserDetailsService는 DB에 저장된 회원의 비밀번호와 비교해 일치하면 UserDetails 인터페이스를 구현한 객체를 반환하는데, UserDetailsService는 인터페이스이며 UserDetailsService를 구현한 서비스를 직접 개발해야한다.

8~10.인증 완료 시 SecurityContext에서 인증 개체 설정
인증 로직이 완료되면 AuthenticationManager는 Authentication를 반환하며, 결과적으로 SecurityContext에 사용자 인증 정보가 저장된다.
인증 과정이 끝났으면 AuthenticationFilter에게 인증에 대한 성공 유무를 전달하고 성공하면 AuthenticationSuccessHandler를 호출하고 실패하면 AuthenticationFailureHandler를 호출한다.


패스워드 암호화

비밀번호는 보안을 위해 암호화해서 저장한다. Bcrypt라는 해싱 방법을 사용했으며 Spring security 프레임워크에서 제공

Filter vs Interceptor vs AOP 차이

  • SecurityFilterChain : DispatcherServlet에 전달되기 이전에 여러 ServletFilter를 거침. 이때 Spring Security에서 등록했었던 Filter를 이용해 사용자 보안 관련된 처리를 진행(Spring Framework에 속하지 않음). 웹 컨테이너에서 관리
    =>모든 요청에대한 처리가 필요할때(ex 인코딩 변환 처리)

  • Interceptor : Dispacher와 Controller사이에 위치하여 요청 전후를 가로챔. 스프링 컨테이너에서 관리(ex:로그인 체크, 권한 체크, 로그 확인)

  • AOP : 객체 지향의 프로그래밍을 했을 때, 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리. 비즈니스로직이랑 공통 로직을 구분하고, 공통 로직을 필요한 시점에 적용하는 것.

로깅, 트랜잭션, 에러 처리 등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용. Interceptor와 Filter와 달리 메소드 전 후의 지점에 자유롭게 설정이 가능하며 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

로깅은 AOP에서 하는것이 적합한 것 같다. Filter에 하면 모든 로깅이 다 체크되어 비효율적이고, Interceptor에 하면 적당한 controller에 로깅처리가 가능하나, 비즈니스 로직 타입별(insert,update,select), 특정 에러처리 부분만 로깅 할때 즉 세밀한 로깅처리가 불가하다.

DispatcherServlet : 가장 앞단에서 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해 주는 프런트 컨트롤러(Front Controller)라고 정의

profile
Search & Backend Engineer

0개의 댓글