Spring Security 내부 동작 흐름

sangcheol·2024년 10월 24일
0
post-thumbnail

스프링 시큐리티의 내부 동작 흐름은 HTTP 요청을 처리하는 과정에서 어떻게 인증과 보안을 관리하는지 보여주는 중요한 개념입니다. 이를 이해하면 스프링 시큐리티가 웹 애플리케이션의 보안을 어떻게 강화하는지 명확해집니다. 이 글에서는 스프링 시큐리티의 기본적인 인증 흐름을 단계별로 설명하겠습니다.

1. 클라이언트의 요청 처리

먼저, 최종 사용자가 브라우저 또는 Postman 같은 도구를 이용해 애플리케이션에 HTTP(S) 요청을 보냅니다. 만약 해당 요청이 스프링 시큐리티로 보호된 엔드포인트로 들어오면, 이 요청은 서블릿 필터 체인에 있는 스프링 시큐리티 필터에 의해 가로채집니다. 스프링 시큐리티는 여러 개의 필터(예: 5개, 10개, 20개 등)를 가지고 있으며, 각 필터는 설정에 따라 요청을 하나씩 처리하게 됩니다.

2. 자격 증명 처리

사용자가 올바른 자격 증명(예: 사용자 이름과 비밀번호)을 제공했다고 가정하면, 이 자격 증명은 HttpServletRequest 객체에 포함되어 HTTP 헤더나 본문(body)에 위치하게 됩니다. 하지만 애플리케이션 전체에서 HttpServletRequest 객체를 직접 사용할 수 없으므로, 스프링 시큐리티 필터는 먼저 자격 증명 부분을 Authentication 객체로 변환합니다. 이 Authentication 객체에는 username, password, isAuthenticated 같은 필드가 존재하며, 객체가 처음 생성될 때 isAuthenticated 필드는 false로 설정됩니다.

3. Authentication Manager로 전달

생성된 Authentication 객체는 AuthenticationManager로 전달됩니다. AuthenticationManager는 인증을 완료하는 책임을 가지며, 그 결과를 다시 필터로 전달합니다. 다만, 실제로 인증을 처리하지는 않고, 인증 요청을 적절한 곳으로 전달하는 역할만 합니다.

4. Authentication Provider에 위임

AuthenticationManager는 실제 인증을 처리하기 위해 AuthenticationProvider에게 이 역할을 위임합니다. 스프링 시큐리티는 여러 가지 인증 프로바이더를 제공하며, 필요에 따라 커스텀 프로바이더를 구현할 수도 있습니다.

5. 사용자 정보 로드

AuthenticationProvider는 실제 인증을 수행하기 위해 UserDetailsService 또는 UserDetailsManager의 도움을 받아 사용자 정보를 로드합니다. AuthenticationProviderAuthentication 객체의 사용자 이름을 기반으로 UserDetails 객체를 찾고, UserDetailsManager를 통해 해당 사용자의 세부 정보를 가져옵니다.

6. 비밀번호 검증

AuthenticationProvider는 사용자가 입력한 비밀번호와 DB에 저장된 비밀번호를 비교하기 위해 PasswordEncoder를 사용합니다. 이 PasswordEncoder는 비밀번호를 평문으로 저장하거나 해싱 알고리즘을 통해 암호화하여 저장하는 역할을 하며, 이를 통해 비밀번호를 안전하게 관리할 수 있습니다.

7. 인증 성공/실패 처리

PasswordEncoder를 통해 비밀번호가 일치하는 경우, AuthenticationProvider는 인증이 성공했다고 AuthenticationManager에게 알립니다. 이때 Authentication 객체의 isAuthenticated 필드 값은 true로 변경됩니다. AuthenticationManager는 이 필드를 통해 인증 성공 여부를 알 수 있습니다.

8. 인증 결과 반환

인증이 완료된 Authentication 객체는 다시 스프링 시큐리티 필터로 반환됩니다.

9. SecurityContext에 저장

스프링 시큐리티 필터는 인증된 정보를 SecurityContext에 저장합니다. 이 Authentication 객체는 세션 ID와 연관되며, 이후 동일한 브라우저에서 동일한 보호된 페이지에 접근하면 SecurityContext에서 세부 정보를 로드합니다. 이렇게 하면 최초 요청 이후에는 매번 인증을 새로 하지 않고, 이미 인증된 사용자 정보를 사용해 빠르게 응답을 처리할 수 있습니다.

10. 최종 응답 처리

마지막으로 인증 결과에 따라 클라이언트에게 응답이 전송됩니다. 인증에 성공한 경우 API 응답을 반환하고, 인증에 실패한 경우에는 401(Unauthorized) 또는 403(Forbidden) 오류 메시지가 반환됩니다.

스프링 시큐리티는 이와 같은 철저한 인증 흐름을 통해 웹 애플리케이션의 보안을 강화하며, 이를 통해 사용자는 안전하게 애플리케이션을 이용할 수 있고, 개발자는 간편하게 보안 설정을 적용할 수 있습니다.

profile
백엔드 개발자

0개의 댓글