본문 바로가기
Develop/Spring

스프링 시큐리티 사용해보기

by dev_m.w 2025. 8. 25.

 

스프링 시큐리티 프레임워크를 사용하는이유?

웹을 만들떄 우리가 직접 사용자 인증과 권한 + 각종 보안까지 다만들수는 없다, 만든다고 해도 안전하지 않고 시간적인 측면에서 비효율. 그래서 이미 만들어진 프레임워크를 잘 사용하면된다.

 

 

스프링 시큐리티 간단한 동작 방식

시큐리티 동작방식.

 

 

더 디테일한 스프링 스큐리티 동작방식

-> 링크 

 

 

  • 필터 체인(Filter Chain) 생성
    • 스프링 시큐리티를 프로젝트에 추가하면, **DelegatingFilterProxy**라는 필터가 서블릿 컨테이너에 등록.
    • 이 필터가 스프링 시큐리티의 모든 인증·인가 로직을 담당하는 여러 필터를 연결한 체인을 관리함.
  • 요청 처리 흐름
    1. 클라이언트가 URL로 요청을 보냄
    2. 요청은 서블릿 컨테이너스프링 시큐리티 필터 체인 순서로 들어옴
    3. 필터 체인이 요청을 검사
      • 인증(Authentication) 필터: 로그인 상태 확인
      • 인가(Authorization) 필터: 접근 권한 확인
      • CSRF, CORS, 세션 관리 등 추가 보안 체크
    4. 통과하면 실제 컨트롤러로 요청 전달
    5. 실패하면 스프링 시큐리티가 예외 처리 또는 에러 응답 반환

 

 

 

SecurityConfig 작성

 

 

 

 @Bean
    public SecurityFilterChain filterChain(HttpSecurity http)throws  Exception{

        http.authorizeHttpRequests((auth) -> auth
                .requestMatchers("/","/login").permitAll()
                .requestMatchers("/admin").hasRole("ADMIN")
                .requestMatchers("/my/**").hasAnyRole("ADMIN","USER")
                        .anyRequest().authenticated());

        http  //커스텀 로그인 설정
                .formLogin((auth)-> auth.loginPage("/login") //로그인 페이지 경로 설정
                        .loginProcessingUrl("/loginProc") //로그인시 사용된 아이디,비밀번호 데이터를 보낼 url
                        .permitAll()
                );
        http
                .csrf((auth) -> auth.disable());

       

 

http-> 건물(웹 어플리케이션)
        authorizeHttpRequests() 권한 시작-> 문지기야 호출.
        requestMatchers 받은 권한에다가 문지기에게 설명해주는것 여기(/)에는 아무나 들어와두되라고
        anyRequest().anthenticated()    ->     나머지 입구로 들어오려면 신분증()이 필여하니깐 검사해

 

 

개발환경에서는 csrf를 disable 처리해줘야한다.

 

 

 

 

2. csrf 공격이란?
-> 해커가 사용자의 브라우저 세션을 악용해서 몰래 요청을 보내는 공격


스프링 시큐리티는 POST, PUT, DELETE 요청에 대해 CSRF 토큰 검증을 기본으로 켜두어야함
그래서 <form>에서 로그인, 회원가입 같은 걸 할 때 CSRF 토큰이 없으면 403 Forbidden 에러가 발생함.
그래서 보통 운영환경에서는 from로그인에 csrf 토큰을 같이 hidden 처리해서 보내준다.

처리과정 예시) 사용자가 /admin 요청 보냄 -> 인증 안됌 -> 스프링 시큐리티가 /login 페이지로 리다이렉트( 이떄 
서버(spring secruty)가 로그인 페이지 html을 랜더링해서 내줄떄 세션에 랜덤한 csrf 토큰을 하나 생성해서 준다.
그래서 서버는 상태를 변경하는 요청(post,put,delete)등 항상 csrf 토큰 검증을 해줘야 방지할수있음. get요청은 대부분 불필요,

 

 

 

  로그인 검증 로직 



로그인 흐름 요약

사용자 로그인 시도

클라이언트에서 아이디(username), 비밀번호(password) 입력

스프링 시큐리티가 AuthenticationManager → UserDetailsService 호출(db에서 값을 가져오는 역활)

loadUserByUsername(username) 실행

DB에서 사용자 조회

조회된 정보를 UserDetails 객체로 변환해서 반환

스프링 시큐리티가 검증 수행

UserDetails.getPassword()와 사용자가 입력한 비밀번호를 비교 (PasswordEncoder 사용)

UserDetails.getAuthorities()로 권한 체크

isEnabled(), isAccountNonLocked() 등 계정 상태 확인

인증 성공 시

Authentication 객체 생성

SecurityContext에 저장

이후부터는 인증된 사용자로 인가(Authorization) 처리 가능