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이 부여.
- 기본
로그인페이지와로그아웃페이지URL 제공
。Spring Security 의존성추가 시 기본적으로 제공되는 기능.
。localhost:8080/login:
▶Spring Login Form도출
。localhost:8080/logout:
▶Session Cookie를 삭제하여 기존 로그인된 자격증명을 로그아웃
▶ 차후HTTP Request전송 시Authorization Header에 포함되지않아서요청이 거절됨.
▶ HTML의<a class="nav-link" href="/logout">으로 간단하게 로그아웃 버튼을 생성할 수 있다.
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에사용자 세션을 저장하므로보안성이 좋음
。서버에사용자 세션을 저장하므로 다른서버에서는 해당사용자정보를 알 수 없는 단점이 존재
▶세션클러스터링,스티키세션:redis를프록시 서버로 설정하여요청시 거쳐가도록하여사용자세션을redis에 저장 및 관리
。Session기반 인증방식은클라이언트에서서버에 특정User에 대한 정보를 요청할때마다 일일이세션ID의 일치여부를 확인.
토큰기반 인증( JWT )
。사용자가토큰을서버에서 발급하여 보유하면서서버에인증용도로 포함하여요청
▶Client-Side에서JWT 토큰을 저장
OAuth 2.0기반 인증
。인증,인가를어플리케이션 서버가 아닌 외부의인증서버(구글,카카오등 )가 대신 수행
OAuth( Open Authorization ) :
。사용자의자격증명을 직접 제공하지 않아도,타 어플리케이션의자원에 안전하게 접근할 수 있도록 하는프로토콜
▶ 사용자가 자신의계정정보를 노출하지 않고도 다른 서비스와 안전하게 연동이 가능.
。어플리케이션 서버에서는인가작업및개인정보를 구현하지 않아도되므로 용이하게 사용
▶ 개인정보 취급은 법 등 복잡하게 엮어있어서
OAuth 2.0 Resource Server:
。OAuth2.0 Authentication을 기반으로Authenticated된 사용자에 대해서만 접근할 수 있도록 보호된API를 제공하는서버.
OAuth주요 개념
Resource Owner:
。API를 통해 보호된Resource를 소유한 주체.
ex)Google Drive의 파일을 소유하고 있는클라이언트
Client Application:
。Resource Owner대신API를 호출하는어플리케이션
ex)Google Drive파일에 접근하고자 하는Spring Application
ex)
Resource Server:
。API를 제공하고,인증된Access Token을 포함한HTTP Request만 허용하는 Server
▶Access Token을검증하여HTTP Request를 허용 또는 거부.
ex) 접근하려는Google Drive파일을 보관하는 Server( =Google Drive)
Authorization Server:
。클라이언트의인증을 담당 및인증된클라이언트에 대해Access Token을 발급하는Server
ex)Google OAuth Server