Spring Security
인증, 권한 관리 그리고 데이터 보호 기능을 포함하여 웹 개발 과정에서 필수적인 사용자 관리 기능을 구현하는데 도움을 주는 Spring의 강력한 프레임워크이다.
Spring Security는 '인증'과 '인가'에 대한 부분을 Filter 흐름에 따라 처리하고 있다.
클라이언트의 요청을 처리하고 그 결과를 반환하는 기술을 서블릿이라고 부르는데, 서블릿 Filter는 HTTP 요청을 가로채 전처리 및 후처리를 수행할 수 이도록 만들어진 기술이다.
Spring Security는 이 서블릿 Filter에 Security Filter를 거치게 해서 인증, 인가 및 여러 보안처리를 한다.
Spring Security는 보안과 관련해서 체계적으로 많은 옵션을 제공해 주기 때문에 개발자 입장에서는 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있다.
구조
Spring Security의 구조이며 전체적인 흐름은 아래와 같다.
흐름
- 사용자가 아이디/비밀번호를 전달해서 로그인을 요청
- AuthenticationFilter에서 UsernamePasswordAuthenticationToken을 생성
- 이메일, 비밀번호를 저장하고, AuthenticationManager에게 전달
- AuthenticationManager은 등록된 AuthneticationProvider에게 인증처리를 요구
- AuthenticationProvider은 UserDetailsService구현객체를 이용해서 아이디에 대한 사용자정보를 데이터베이스에서 조회
- 데이터베이스에서 조회된 사용자 정보는 UserDetails를 구현한 User객체에 담는다.
- 조회된 사용자정보가 저장된 UserDetails 구현객체를 AuthenticationProvider에게 반환한다.
- AuthenticationProvicer는 UserDetails 구현객체에 저장된 비밀번호와 Username~Token에 저장된 입력한 비밀번호를 비교한다. 인증이 성공되면 UsernameAuthenticationToken을 생성해서 인증된 사용자정보를 저장하고, AuthenticationManager에게 UsernameAuthenticationToken을 전달한다.
- AuthenticationManager는 AuthenticationFilter에게 UsernamePassword~Token을 전달한다.
- AuthenticationFilter는 전달받은 UsernamePassword~Token을 Spring Security의 In-Memory 저장소인 SecurityContextHolder에 저장한다.
주요 모듈
Authentication
현재 접근하는 주체의 정보와 권한을 담는 인터페이스
Authentication 객체는 SecurityContext에 저장되며, SecurityContextHolder를 통해 SecurityContext에 접근하고, SecurityContext를 통해 Authentication에 접근할 수 있다.
Authentication Manager
사용자의 인증을 처리하고 사용자의 시원을 확인하는 역할
여러 인증 프로바이더를 지원하며, 커스텀 인증 로직 구현 가능
UserDetailsService
데이터베이스에서 사용자 정보를 조회하는 인터페이스
loadUserByUser(String username) 메서드를 통해 데이터베이스에서 사용자정보를 조회한다.
애플리케이션에서는 실제로 사용하는 데이터베이스 환경에 맞게 UserDetailsService의 loadUserByUsername() 메서드를 재정의한 구현클래스를 작성한다.
Security Filter Chain
다양한 보안 필터가 연결된 필터 체인으로, 요청을 처리하고 응답을 생성하기 전에 다양한 보안 검사를 수행
인증, 권한부여, CSRF 방지 등을 처리
SecurityContext, SecurityContextHolder
SecurityContext는 인증된 Authentication 객체를 저장하고 있는 인터페이스
SecurityContextHolder는 SecurityContext에 대한 Helper 클래스
SecurityContextHolder.getContext() 메서드를 통해서 애플리케이션의 어느 곳에서든지 SecurityContext를 획득할 수 있다.
JWT
JWT(Json Web Token)은 토큰 기반의 인증 시스템 중 하나로, Spring Security와 자주 통합되어 사용된다.
기존 Cookie & Session 방식의 로그인 방식과 차별점은 state-less함으로써 서버의 확장성이 용이하며 대량의 트래픽이 발생해도 대처할 수 있다.
발급과정
발급과정은 인증 요청 - 토큰 생성 - 토큰 응답 - 토큰 검증 단계로 진행된다.
- 인증 요청 : 클라이언트가 인증을 위해 로그인을 시도하면, Spring Security는 AuthenticationManager(UserDetailsService, PasswordEncoder 등)를 통해 사용자를 검증하고 인증 객체를 생성한다.
- 토큰 생성 : 인증이 성공하면, 서버는 JWT 토큰을 생성한다. 토큰의 payload 부분에는 사용자 정보, 권한 등 필요한 정보가 담겨있다.
- 토큰 응답 : 생성된 JWT 토큰을 틀라이언트에게 응답으로 보낸다. 클라이언트는 이후 요청 시에 HTTP 헤더나 쿼리 파라미터 등을 통해 JWT를 전송하여 인증을 유지한다.
- 토큰 검증(인증 요청) : 클라이언트가 JWT를 담아서 요청을 보내면, 해당 토큰의 만료긴한이 유효한지, 서명이 올바른지 등 유효성을 검증하고 필요한 권한을 확인해서 사용자를 인증한다.
실전
Q. Spring Security의 구조에 대해 설명해주세요
A. Spring Security는 "인증"과 "인가"를 Filter에 흐름에 따라 처리하는 Spring의 하위 보안 프레임워크입니다. Spring Security는 서블릿 필터에 Spring Security에서 제공하는 인증, 인가를 위한 필터들의 모음(Security Filter Chain)을 거치게 해서 인증, 인가 및 보안 처리를 실행합니다. 주요 모듈로는 Authentication, AuthenticationManager, UserDetailsService 등이 있습니다.
Q. JWT의 발급과정에 대해 설명해주세요
A. JWT는 Json Web Token의 약자로 토큰 기반의 인증 시스템입니다. 기존의 세션방식 로그인과 달리 stateless를 유지함으로써 서버의 확장성이 용이하며 대량의 트래픽이 발생해도 대처할 수 있는 특징이 있습니다. 유저에게 jwt 토큰을 발급하는 과정은 인증 요청, 토큰 생성, 토큰 응답, 토큰 검증입니다. 유저가 인증 요청(로그인)을 시도하면 입력한 아이디/비밀번호를 통해 AutheticationManager가 사용자를 검증하고 인증 객체를 생성합니다. 인증 요청에 성공하면 서버는 jwt토큰을 생성하는데 그 안에 필요한 정보를 담고, 서명을 통해 무결성을 보장합니다. 생성된 토큰을 유저에게 반환함으로써 응답합니다. 일반적으로 이 토큰은 헤더에 포함되거나 응답 본문에 담겨서 전달됩니다. 유저는 인증/인가가 필요한 서비스를 이용할 때마다 반환받은 토큰을 제출하여 만료시간, 서명 등 유효성을 검증하고 필요한 권한을 확인하는 등 사용자를 인증받습니다.
참고
https://dev-coco.tistory.com/174
항해 개발자 취업 리부트 코스를 수강하고 작성한 콘텐츠 입니다.
IT 커리어 성장 코스 항해99, 개발자 취업부터 현직자 코스까지
항해99는 실무에 집중합니다. 최단기간에 개발자로 취업하고, 현직자 코스로 폭발 성장을 이어가세요. 실전 프로젝트, 포트폴리오 멘토링, 모의 면접까지.
hanghae99.spartacodingclub.kr
'멋진 개발자 > Java & Spring' 카테고리의 다른 글
[항해 취업코스] 개발자 취준 기록 17 - 즉시로딩, 지연로딩 (3) | 2024.03.12 |
---|---|
[항해 취업코스] 개발자 취준 기록 16 - N + 1 발생 이유와 해결방법 (0) | 2024.03.12 |
[항해 취업코스] 개발자 취준 기록 14 - Annotation (0) | 2024.03.10 |
[항해 취업코스] 개발자 취준 기록 13 - MVC 모델 (0) | 2024.03.07 |
[항해 취업코스] 개발자 취준 기록 12 - DI와 IoC (0) | 2024.03.07 |