0. 개요
프로젝트에 로그인, 회원가입과 같은 인증 인가 로직을 구현할 때, 주로 Spring Security와 JWT 토큰을 이용한다고 하는데 이 부분에 대해 1도 모르기 때문에 정리하면서 차근차근 알아보려고 한다.
1. Spring Security란?
Spring Security는 스프링 기반의 애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링의 하위 프레임워크이다.
Spring Security에 대해 알아보기 전에 인증과 인가 개념을 정리하고 가면 좋을 것 같다.
인증(Authentication)
-> 사용자가 누구인지 확인하는 과정
-> 사용자 이름과 비밀번호 같은 자격 증명을 통해 인증한다.
인가(Authorization)
-> 사용자가 특정 리소스에 접근할 수 있는 권한을 가지고 있는지 확인하는 과정.
-> 예를 들면, 관리자만 특정 페이지를 볼 수 있도록 권한을 설정하는 것.
1-1. 필요 이유
쓰는 이유가 나는 정말 중요한데, 다음과 같은 이유들로 사용한다고 한다.
1) 인증(Authenticatio) 문제
인증에 있어서, 로그인 없이 누구든지 특정 URL로 접근할 수 있다면 중요한 정보나 기능에 손쉽게 접근할 수 있다.
-> Spring Security는 인증 기능을 쉽게 구현해서 사용자가 로그인과 같은 인증을 하지 않았으면 로그인 페이지로 리다이렉트하거나 접근을 막아준다.
2) 인가(Authorization) 문제
인증된 사용자라도 특정 기능 및 리소스에 제한적으로 접근할 수 있어야 한다.
-> Spring Security는 URL이나 메서드 단위로 권한 설정을 쉽게 할 수 있다.
3) 보안 공격 방어 (CSRF, Session Fixation 등)
* CSRF (Cross-Site Request Forgery)
-> 사용자가 자신의 의지와 상관없이 데이터를 수정하거나 삭제, 등록하도록 하는 공격이다.
웹 애플리케이션은 위에 언급한 CSRF와 같이 다양한 보안 공격에 노출될 수 있다.
-> Spring Security는 CSRF 토큰을 사용해 공격을 막아주는 기능을 포함하고 있다.
4) JWT, OAuth2 같은 인증 방식의 통합 지원
REST API 사용시 세션 방식 보다는 JWT 기반 인증 방식을 많이 사용하게 된다.
-> Spring Security는 이 JWT, OAuth2 등을 쉽게 설정하고 사용할 수 있도록 해준다.
-> JWT 기반 인증으로 설정하면 로그인 시 토큰 발급, 요청마다 토큰 검증, 권한 체크 등의 작업을 자동으로 처리해준다.
이러한 기능들을 직접 코드로 짜게 된다면 굉장히 복잡하고 어렵기 때문에 이를 편리하게 제공해주는 Spring Security를 사용한다!
2. Spring Security 인증 동작 방식
Spring Security는 Filter Chain이라는 방식으로 동작한다. 클라에서의 요청이 서버에 도달하게 되면 일련의 필터들이 차례대로 실행되며 요청을 검증하고 권한을 확인한다.
가장 많이 사용하는 아이디와 패스워드 기반 폼 로그인 시도시에 인증 흐름 자체는 다음과 같이 진행된다.
1) HTTP 요청
-> 사용자가 /login URL로 로그인을 요청 한다.
-> 이때 username과 password가 포함된다.
2) Authentication Filter
-> 요청이 Authentication Filter에서 가로채게 된다.
-> 그리고 사용자가 보낸 자격 증명(username, password)을 담은 UsernamePasswordAuthenticationToken 객체가 생성된다.
-> 생성된 토큰 객체는 인증이 되지 않은 상태이기 때문에, 인증 프로세스를 진행하기 위해 AuthenticationManager로 전달된다.
3) Provider Manager
-> AuthenticationManager를 구현한 ProviderManager는 다양한 인증 방식을 지원하기 위해 여러 개의 AuthenticationProvider를 가지고 있다.
-> 요청을 적합한 AuthenticationProvider로 전달한다.
4) AuthenticationProvider
-> ProviderManager로부터 받은 UsernamePasswordAuthenticationToken 객체를 처리한다.
-> AuthenticationProvider는 사용자 인증을 실제로 수행하는 클래스이다.
-> 보통적으로 DaoAuthenticationProvider를 사용하는데, 얘는 UserDetailService를 이용해 사용자 정보를 확인한다.
5) UserDetailService
-> 사용자 정보를 조회하는 서비스 인터페이스이다.
-> 사용자 정보를 데이터베이스에서 로드해 User 객체로 반환한다.
-> 예를 들자면, DB에서 사용자 정보를 불러오는 역할을 한다.
6) UserDetailService -> AuthenticationProvider로 사용자 정보 전달
-> 조회된 사용자 정보를 AuthenticationProvider로 반환한다.
-> 이때, 조회된 사용자 정보에는 사용자 이름, 비밀번호, 권한 정보 등이 포함된다.
7) AuthenticiatonProvider 인증 수행
-> AuthenticationProvider는 제공된 비밀번호와 조회된 사용자 정보의 비밀번호를 비교한다.
-> 일반적으로는 PasswordEncoder라는 것을 사용해 암호화된 비밀번호를 비교한다.
-> 인증에 성공하면 Authentication 객체를 생성해 반환한다.
8) Authentication 객체 반환 (ProviderManager -> Authentication Filter)
-> 인증 성공 시, ProviderManager는 인증된 Authentication 객체를 Authetnciation Filter 로 반환한다.
-> 이제 이 객체는 인증된 상태로 전환되었다.
9) SecurityContextHolder에 저장
-> 인증에 성공하면 SecurityContextHolder에 Authentication 객체가 저장된다.
'Back-end > Server' 카테고리의 다른 글
[Spring] HTTP 응답 Message Body 직접 입력 (2) | 2025.04.12 |
---|---|
[Spring] JWT(Json Web Token)란? (0) | 2025.04.06 |
[Spring] 스프링 구조 정리 (0) | 2025.01.11 |
[Server] 웹서버 VS 웹 어플리케이션 서버(WAS) (0) | 2024.06.02 |
[Spring] 스프링 빈이란? (0) | 2024.05.28 |