Notice
Recent Posts
Recent Comments
Link
04-27 17:38
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
Archives
Today
Total
관리 메뉴

<<개발일지>>

Spring security 본문

Spring

Spring security

개발하는지호 2024. 3. 24. 22:36

Spring Security
 
이번 주는 Spring 중에서도 Security에 대해 공부를 했다. 우리고 정보화 시대를 살고 있는 만큼 많은 정보들이 있고 이 정보들이 재산이 되고 있는 실정이다. 
 
이때 보안이라는 것은 정말 중요한 요소 중에 하나이다. 우리가 사용하는 프레임 워크 중 하나인 Spring도 이를 중요시하여 적용하고 있는데,
 
예전에 정리한 내용을 보면

 Spring 프레임워크가 등장했다. Spring 프레임워크는 매우 높은 수준으로 서버 성능, 안정성, 보안 등을 제공하는 도구이다. 이로써 개발자들은 기능 개발에 집중할 수 있게 되었다.

 
 
이렇듯 Spring은 기능 뿐만이 아니라 보안에서도 개발자의 편의를 봐주고 있다. 이는 Spring Security로 설명이 된다.
 

Spring Securtiy란 

Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. 
스프링 시큐리티를 이해하려면 인증과 인가에 대한 개념을 알아야 한다.
 

인증과 인가

 
 인증(Authentication): 사용자의 신원을 입증하는 과정이다. 예를 들어 사용자가 사이트에 로그인을 할 때 누구인지 확인하는 과정을 인증이라고 한다. 
 
 인가(Authorization) : 인가는 인증과는 다르다. 인가는 사이트의 특정 부분에 접근할 수 있는지 권한을 확인하는 작업이다. 예를 들어 관리자는 관리자 페이지에 들어갈 수 있지만 일반 사용자는 관리자 페이지에 들어갈 수 없다. 이런 권한을 확인하는 과정을 인가라고 한다.
인증과 인가 관련 코드를 아무런 도구의 도움 없이 작성하려면 굉장히 많은 시간이 필요하다.
하지만 우리에겐 Spring Security가 있다 걱정할 필요가 없다 !!
 
 스프링 시큐리티
앞서 말했듯이 스프링 시큐리티는 스프링 기반 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크이다. 보안 관련 옵션을 많이 제공하고 있는있고, 애너테이션으로 설정도 매우 쉽다. 그리고 CSRF 공격, 세션 고정(session fixation) 공격을 방어해주며 요청 헤더도 보안 처리를 해주므로 개발자가 보안 관련 개발을 해야 하는 부담을 크게 줄여준다.
 
 
필터 기반으로 동작하는 스프링 시큐리티
스프링 시큐리티는 필터 기반으로 동작한다. 

 
스프링 시큐리티는 이렇게 다양한 필터들로 나누어져 있으며, 각 필터에서 인증, 인가와 관련된 작업을 처리한다.
 
SecurityContextPersistenceFilter부터 해서 FilterSecurityInterceptor까지 순서대로 내려가며 필터를 거친다. 
필터를 실행할 빨간색 화살표로 연결된 오른쪽 박스의 클래스를 거치며 실행한다.
 
여기서 눈여겨볼 필터 2가지가 있다.
 
UsernamePasswordAuthenticationFilter
- 아이디와 패스워드가 넘어오면 인증 요청을 위임하는 인증 관리자 역할을 한다.
FilterSecurityInterceptor
- 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 하는 접근 결정 관리자 역할을 한다.
 
 
현 시점 가장 많이 사용하는 아이디와 패스워드 기반 폼 로그인을 시도하면 스프링 시큐리티에서는 어떤 절차로 인증 처리를 하는지 그림으로 볼 수 있다.
 

스프링부트3 백엔드 개발자되기(신선영지음)

 
 

  1. 사용자가 폼에 아이디와 패스워드를 입력하면, HTTPServletRequest에 아이디와 비밀번호 정보가 전달된다. 이때 AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 한다.
  2. 유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다.
  3. 전달받은 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보낸다.
  4. UsernamePasswordAuthenticationToken을 AuthenticationProvider로 보낸다.
  5. 사용자 아이디를 UserDetailService에 보낸다. UserDetailService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에게 전달한다. 
  6. DB에 있는 사용자 정보를 가져온다.
  7. 입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 한다.
  8. ~ 10 까지 인증이 완료되면 SecurityContextHolder에 Authentication을 저장한다. 인증 성공 여부에 따라 성공하면 AuthenticationSuccessHandler, 실패하면 AuthenticationFailureHandler 핸들러를 실행한다.

 
이렇게 스프링 시큐리티 폼 로그인의 인증 흐름을 정리해보았다. 스프링 시큐리티의 폼 로그인을 설정하는 것은 간단하지만 실제로는 이러한 복잡한 내부 동작을 실행한다.