Spring Security
。
Spring 생태계의REST API와Web Application의보안(인증: Authentication /인가: Authorization 등)을 제공하는Spring Framework
▶ 여러개발자들에 의해서 관리되고 있음
。Spring Security를 통해보안에 필요한 기능을 제공함으로써 개발자가보안 관련 logic을 따로 작성할 필요는 없음.implementation 'org.springframework.boot:spring-boot-starter-security'
Complete Mediation:
。Spring Security의의존성이 적용되는 경우어플리케이션의 모든Resource가 보호되어 접근하는 모든API호출에 대해Security Filter Chain에 의한Authentication을 수행.
▶ 기존에Controller Method에 의해 정의된API외에도 존재하지않는API를 호출하는 경우에도자격증명을 요구.
。Spring Security 6.x부터는체이닝 방식이 아닌,람다기반 설정방식권장
。Spring Filter Chain을 통해 Customize가 가능한 유연한 Security System을 제공하여 사용자에게 적절한Authentication과Authorization이 부여.
Spring Security 원리
。Spring MVC 패턴에서REST API호출을 위한Dispatcher Servlet으로 전송되는 모든HTTP Request를Spring Security가Intercept하여Spring Filter Chain을 통해HTTP Request의Authorization과Authentication을검증후Dispatcher Servlet으로 전달하여 최종적으로Contoller로 전달.
Spring Filter Chain에 의한사용자인증정보에 대한검증순서
1.HTTP Request의Authorization Header에 포함된JWT Token을서버로 전송 시검증전의 미완성된Authentication 구현체생성
。해당Authentication 구현체는Authorization header에 포함된사용자인증정보를credentials로 포함하고 나머지authorities,principal는null
2.Controller의 매개변수로 사전에AuthenticationManager객체.authenticate(Authentication구현체)로검증을 수행
。AuthenticationManager객체내에서사용자인증정보에 적합한검증기능을 지닌AuthenticationProvider를 식별 후검증수행
▶JWT인 경우JwtAutheticationProvider를 사용하여검증
。UserDetailsService를 호출하여 매개변수로 전달된Authenticationinstance의Credentials정보에서 포함된username에 해당하는 사용자정보를DB에서 조회 후UserDetails 객체로 return.
▶Authenticationinstance의Credentials의 Password와UserDetailsinstance의 Password를 서로 비교하여 검증을 수행.
3.검증 성공시HTTP Request의principal,authorities,credentials를 포함한Authentication 구현체생성
。검증 실패시AuthenticationException발생.
Spring Security의 인증방식
。인증방식 크게 4가지
。세션기반/토큰기반/OAuth2.0 기반
세션기반 인증
。서버의인증용도 DB에 사용자정보를 저장
▶Server-Side에사용자 세션을 저장하므로보안성이 좋음
° 한서버에서사용자 세션을 저장 시 다른서버에서는 해당사용자정보를 알 수 없는 단점이 존재
▶세션클러스터링,스티키세션:백엔드 서버를 다중으로 구성 시세션 관리용도의서버를 설정하여요청시 항상 거쳐가도록하여사용자세션을 해당서버에서 저장 및 관리
。Session기반 인증방식은클라이언트에서서버에 특정User에 대한 정보를 요청할때마다 일일이세션ID의 일치여부를 확인.
세션은서버 인메모리 DB에 저장
。Spring상에메모리 공간상에 저장하며,세션 용량이 과대해지는 경우OOM이 발생할 수 있으므로, 따로Redis를 통해서 통합해서 관리하기도 함
토큰기반 인증( JWT )
。사용자가토큰을서버에서 발급하여 보유하면서서버에인증용도로 포함하여요청
▶Client-Side에서JWT 토큰을 저장