Spring Security

Rina's·2023년 7월 10일

코드스테이츠

목록 보기
63/96

Spring Security

Spring MVC 기반 앱의 보안 표준 프레임워크
스프링 부트 사용을 통해 간단한 설정으로 많은 기능을 제공하며
사용자 인증 권한부여를 구현한다

  • 사용자 인증
  • 사용자 권한 차등 적용
  • 리소스에 대한 접근 제어
  • 데이터 암호화
  • SSL 적용
  • 웹 보안 공격 차단

사용자 인증 종류

  1. 폼 기반 인증
  2. 토큰 기반 인증
  3. HTTP
  4. JWT(JSON Web Token)
  5. OAuth2 인증

Principal(주체)
서비스를 이용할 수 있는 사용자 또는 사용자 계정 정보
유저 외에도 작업을 수행하는 장비, 시스템을 포괄

Authentication(인증)
서비스 사용자임을 증명하는 절차, 인증을 통한 권한 부여를 진행
2팩터 인증
기존 패스워드 인증에 더한 추가 인증처리

Credential
사용자 식별을 위한 신원증명에 관련한 정보
주민번호, 패스워드 등

Authorization(인가)
인증된 사용자에게 권한을 부여하는 과정

Access Control(접근제어)
앱 리소스에 접근하는 행위를 제어

보안 적용시 요청처리 흐름

인증, 인가처리 요청 흐름
1. 리소스 요청->
2. <-크레덴셜 요청
3. 크리덴셜 제공->
4. 크리덴셜 저장소에서 조회, 대조 (no -> exception throw)
5. 컴포넌트(접근 결정 관리자) 권한 검증 (no -> exception throw)
6. 리소스 접근 허용

서블릿 필터와 필터 체인

서블릿 필터

  • 자바 웹 앱에서 HTTP 요청, 응답이 엔드포인트에 도달하기 전 가로채어 수정하거나 필터링하는 기능을 제공하는 자바 컴포넌트
  • 서블릿 컨테이너 내에서 작동하며
  • 하나 이상의 필터들을 연결해 필터 체인을 구성
  • 각각의 필터가 Filter 인터페이스의 doFilter() 구현(전처리, 후처리 로직)

서블릿 필터 체인 -> HTTP서블릿 -> 디스페처서블릿 -> 인터셉터 -> 스프링 MVC

스프링 시큐리티 필터

  • ApplicationContext에 Bean으로 등록하여 사용
  • 스프링 시큐리티 필터 체인은 서블릿 필터 체인 사이에 설정되며,
    스프링 컨테이너와 서블릿 켄테이너는 별개의 영역이기에 연결이 필요
  • 때문에 DelegatingFilterPorxy(브릿지), FilterChainProxy(시작점)로 구성되어
    서블릿 필터 체인 중간에 위치하여 스프링 시큐리티 필터 영역을 연결시킴
  • FilterChainProxy는 스프링 시큐리티 필터 Chain에 설정된 URI를 확인하여 가장 우선순위에 있는 Filter Chain 하나만을 실행(매핑)

우선순위 설정 방법
1. Filter에 @Order 애너테이션을 추가
2. Orderd 인터페이스를 구현해서 Filter의 순서를 지정
3. FilterRegistrationBean을 이용해 Filter의 순서를 명시적으로 지정

DelegatingPasswordEncoder

  • PasswordEncoder구현 객체를 생성해 주는 컴포넌트
  • DelegatingPasswordEncoder를 사용해 다양한 방식의 암호화 알고리즘을 적용
  • 디폴트 값 사용시 Spring Security 권장 최신 암호화 알고리즘으로 인코팅
    PasswordEncoder passwordEncoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();

Custom DelegatingPasswordEncoder

Map encoders에 원하는 유형의 PasswordEncoder를 수동으로 추가

String idForEncode = "bcrypt";
Map encoders = new HashMap<>();
encoders.put(idForEncode, new BCryptPasswordEncoder());
encoders.put("noop", NoOpPasswordEncoder.getInstance());
encoders.put("pbkdf2", new Pbkdf2PasswordEncoder());
encoders.put("scrypt", new SCryptPasswordEncoder());
encoders.put("sha256", new StandardPasswordEncoder());

PasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(idForEncode, encoders);

Spring Security 5(최신 버전) 사용 시 암호화 알고리즘 유형을 prefix로 추가한다

profile
갭린이 리나

0개의 댓글