본문 바로가기

[Spring] Spring Security

I'm 영서 2024. 7. 28.
반응형

Spring Security란?

 

스프링시큐리티는 스프링 프레임워크 기반의 프로그램의 인증 및 인가를 위한 보안 프레임워크로, 일반적인 보안 요구 사항을 쉽게 충족시킬 수 있다.

 

왜써야해요?

 

일반적인 웹 어플리케이션에서는 사용자 인증, 권한 부여, 공격 방어(CSRF, XSS, SQL Injection)등의 다양한 보안 요구 사항이 필요한데, 이를 하나하나 다 개발자가 만드는게 아니라 Security라는 프레임워크를 사용하여 효율적으로 관리하게 해준다.

 

주요 기능

 

  • 인증(Authentication): 사용자의 신원을 확인하는 과정으로, 다양한 인증 메커니즘(폼 로그인, OAuth, OpenID 등)을 지원한다.
  • 인가(Authorization): 사용자가 애플리케이션의 특정 자원에 접근할 수 있는 권한을 관리한다. 역할 기반 권한 부여, URL 기반 권한 부여 등을 제공
  • 보안 필터(Security Filters): 요청에 대해 여러 보안 필터를 적용하여 보안성을 강화한다. 예를 들어, 'UsernamePasswordAuthenticationFilter'는 사용자의 아이디와 비밀번호를 검증한다.
  • 암호화(Encryption): 비밀번호 등의 민감한 데이터를 안전하게 저장할 수 있도록 암호화 기능을 제공.
  • 세션 관리(Session Management): 세션 고정 공격(Session Fixation Attack) 방어, 동시 세션 제어 등의 기능을 포함
  • 공격 방어(Protection Against Attacks): CSRF(Cross-Site Request Forgery), XSS(Cross-Site Scripting), 세션 하이재킹 등 다양한 웹 공격을 방어하는 기능을 제공.

Spring Security 동작 흐름

 

간략히 설명하면

인증 절차를 거친 후 인가 절차를 진행하는데, 인가 과정 중 해당 리소스에 대한 접근 권한을 확인하여, 인증된 결과에 따라 접근 허용or 거부한다.

 

다들 쓰는 이 이미지 쓰기싫은데 제일 잘 설명한것도 맞아서 참..

 

 

각 절차별 설명과 내부에서 돌아가는걸 말하자면

 

Spring Security 인증 절차

  1. 요청 수신
    • 사용자가 로그인 정보(아이디와 비밀번호)가 담긴 HTTP 요청(request)을 보냄.
    • 이 요청은 UsernamePasswordAuthenticationFilter가 가로챔.
  2. 토큰 생성
    • UsernamePasswordAuthenticationFilter가 요청을 받아서, UsernamePasswordAuthenticationToken 객체(인증을 위한)를 생성함.
    • 이 객체는 인증을 위한 정보를 담고 있고, 이를 기반으로 적절한 AuthenticationProvider를 찾는데 사용됨.
  3. 인증 요청
    • AuthenticationManager에게 인증 요청을 전달함.
    • AuthenticationManager는 여러 AuthenticationProvider를 관리함.
  4. 인증 요청2
    • AuthenticationManager는 Provider 목록에서 적절한 AuthenticationProvider를 찾아 UsernamePasswordAuthenticationToken을 전달함.
    • Provider는 사용자의 인증 정보를 처리할 수 있는 구현체임.
  5. 인증 절차
    • AuthenticationProvider는 데이터베이스 같은 외부 시스템을 통해 사용자의 로그인 정보를 검증함.
  6. 로그인 정보 가져오기
    • UserDetailsService의 loadUserByUsername 메서드를 호출해서 사용자의 세부 정보를 가져옴.
    • 이 단계에서 UserDetailsService는 데이터베이스나 다른 사용자 저장소에서 사용자 정보를 조회함.
  7. 사용자 정보 가져오기
    • 조회된 사용자 정보를 바탕으로 UserDetails 객체를 생성함.
    • 이 객체는 사용자 이름, 비밀번호, 권한 등의 정보를 포함함.
  8. 사용자 정보 대조
    • AuthenticationProvider는 입력된 로그인 정보와 UserDetails에서 가져온 정보를 비교함.
    • 이 단계에서 비밀번호는 보통 암호화된 형태로 저장되어 있음.
  9. 완료
    • 인증이 완료되면 Authentication 객체를 SecurityContextHolder에 담고 AuthenticationSuccessHandler를 실행함.
    • 인증에 실패하면 AuthenticationFailureHandler가 실행됨.

 

의 단계를 거친다. Security가 얼마나 많은 수고를 줄여주는건지..

 

물론 이전에는 이걸 다 짜야했지만, 요즘에 SpringBoot 사용하면 몇줄이면 기본적인 사용이 된다.. 

 

반응형

댓글