728x90

Spring Security

 

[등장 배경]

1. 보안 요구 증가

    웹 애플리케이션이 점점 복잡해지고 민감한 정보를 다루게 되면서, 인증 인가에 대한 처리 필요

 

2. 보안을 직접 구현하기에는 에러 발생 가능성 증가 & 유지보수 어려움 등 문제 다수

 

3. Spring에 통합되어 동작하면서도 보안 기능을 일관되게 제공할 수 있는 프레임워크 필요


  • 필터(Filter) 기반으로 동작하기 때문에 스프링 MVC와 분리되어 관리 및 동작
  • 필터(Filter) 는 Dispatcher Servlet으로 가기 전 적용 => 가장 먼저 url 요청을 받음

 

Spring Security Filter Chain 기반 인증 및 인가 처리 흐름도

 

 

 

Spring Security 인증 파트

Spring Security 인증 구조도

1. Http Request

  • 사용자가 로그인 폼에서 ID/PW 입력 → 서버로 전송

2. AuthenticationFilter (ex: UsernamePasswordAuthenticationFilter)

  • 로그인 요청을 감지해, 사용자의 ID/PW로 UsernamePasswordAuthenticationToken 객체 생성

3. AuthenticationManager

  • 인증을 시도하는 핵심 인터페이스
  • 기본 구현체: ProviderManager

4. AuthenticationProvider

  • 실제 인증 로직을 수행하는 인터페이스
  • 주로 DaoAuthenticationProvider가 사용됨

5. UserDetailsService

  • AuthenticationProvider가 이 인터페이스를 통해 사용자 정보를 불러옴
  • 백엔드 개발자가 직접 구현하는 인터페이스 (loadUserByUsername())

6. UserDetails

  • 유저 정보를 담는 객체 인터페이스
  • 직접 구현한 User 객체가 이를 implements 함
User 와 Member 차이?
스프링에서 제공하는 User & 프로젝트에서 개발자가 직접 만드는 회원 VO( ex : Member)의 차이점이 궁금하다

User : Spring Security 내부 인증/인가용, 로그인 시 UserDetails로 사용됨
Member : DB에 저장되는 사용자 데이터, 회원가입, 조회, 수정 등 도메인 역할

UserDetailsService에서 Member를 조회해서 User로 바꿔주는 역할을 함
public class CustomUserDetailsService implements UserDetailsService {
    private final UserDetailsMapper mapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //mapper를 통해 Member 조회
        MemberVO vo = mapper.get(username);
        
        if (vo == null) {
            throw new UsernameNotFoundException(username + "은 없는 id입니다.");
        }
        
        //Member vo로 UserDetails return
        //업캐스팅(부모 : UserDetails, 자식 : User)
        return new CustomUser(vo);
    }
}​

7. UserDetailsService → UserDetails 반환

  • DB 등에서 사용자 조회 후 UserDetails 구현체 반환

8. AuthenticationProvider 인증 수행

  • UserDetails를 바탕으로 패스워드 검사 → 인증 성공 여부 판단

9. AuthenticationManager → Authentication 반환

  • 인증 성공 시, 인증 정보를 담은 Authentication 객체 반환

10. SecurityContextHolder 저장

  • 최종적으로 인증 정보를 SecurityContextHolder에 저장→ 이후 인증된 사용자 정보는 여기서 꺼내 씀

 


JWT(Json Web Token)

  • JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web 토큰
  • Header.Payload.Signature 세 가지로 구성 / 각 부분은 Base64로 인코딩, .으로 구분

 

 

 

 

Access Token

: 인증된 사용자가 특정 리소스에 접근할 때 사용되는 토큰

 

Refresh Token 

: Access Token의 갱신을 위해 사용되는 토큰

 

728x90

+ Recent posts