맞는데 왜 틀릴까..?

Spring Boot/Spring Security

[Spring Security] Form 인증 방식

안도일 2023. 4. 1. 11:13

 

Spring Security에서 Form 인증 방식은 세션과 쿠키를 함께 사용한다.

 

로그인에 성공하면, Spring Security는 사용자 정보를 기반으로 인증된 세션을 생성한다. 이 세션은 일반적으로 서버 측에 저장되며, 해당 사용자가 로그인한 동안 유지된다.

 

이 세션 ID를 클라이언트 측에 쿠키로 전송한다. 

클라이언트 측에서는 다른 요청을 보낼 때마다 쿠키에 저장된 세션 ID를 서버에 전송하고, 서버는 이를 사용해 해당 세션을 식별한다. 

 

 

 📌세션

서버 측에서 클라이언트의 정보를 저장하는 방식으로, 클라이언트가 최초로 서버에 요청을 보내면 서버는 그 클라이언트를 위한 고유한 세션 ID를 발급하고, 이 ID를 쿠키 등을 통해 클라이언트에게 전송한다.
클라이언트는 이 세션 ID를 가지고 서버에 요청을 보낼 때마다 자신의 정보를 서버에 전달하게 되며, 이를 통해 로그인 상태를 유지할 수 있다.

 

📌 쿠키

클라이언트 측에서 정보를 저장하는 방식으로, 서버가 클라이언트에게 쿠키를 발급하면 이 쿠키는 클라이언트의 웹 브라우저에 저장된다.
클라이언트가 다시 해당 웹사이트에 접속하면 이 쿠키를 이용하여 클라이언트의 정보를 서버에 전달하게 된다. 

 

 


 

🔑 인증 (로그인)

 

 

 

1. 로그인 요청

사용자가 로그인 페이지(/login)로 요청을 보내면, AntPathRequestMatcher를 통해 요청 URL이 /login으로 시작하는지 확인한다.

 

2. 요청 확인

만약 일치한다면, Username과 Password를 Authentication 객체에 저장하여 인증 처리를 위임한다.

일치하지 않은다면 chain.doFilter() 호출

 

3. 인증 처리

인증 처리는 AuthenticationManager를 통해 수행되는데, AuthenticationProvider에게 인증 처리를 위임한다.

인증에 실패할 경우 AuthenticationException 예외를 반환하고, 인증에 성공할 경우 User와 Authorities 정보를 Authentication 객체에 담아 AuthenticationManager에 반환한다.

 

4. SecurityContext

반환된 인증 객체는 SecurityContext에 저장되며, Session에도 저장되어 전역적으로 참조할 수 있다.

 

5. SuccessHandler

인증 성공 이후에는 SuccessHandler에서 인증 성공 이후의 로직을 수행한다.

 

 

📌chain.doFilter()

AntPathRequestMatcher에서 인증에 실패하면 chain.doFilter()를 호출하게 되는데, 이는 인증에 실패한 요청이 다음 필터로 넘어가게 된다는 뜻이다.
즉, 인증에 실패한 요청은 해당 필터에서 더 이상 처리되지 않고 다음 필터로 넘어가게 되며, 다음 필터에서 적절한 처리가 이루어지도록 하는 것이다.

이는 Spring Security의 필터 체인 구조에서 각각의 필터가 순차적으로 실행되어 요청을 처리하는 구조를 따르고 있기 때문이다.

 

 

 

🔑 로그아웃

 

 

 

 

1. 로그아웃 요청 처리

클라이언트로부터 로그아웃 요청이 들어오면, 로그아웃 처리를 담당하는 컨트롤러나 핸들러에서 요청을 처리

 

2. SecurityContextLogoutHandler 실행

로그아웃을 처리하기 위해 SecurityContextLogoutHandler가 실행

SecurityContextLogoutHandler는 SecurityContext 객체에서 Authentication 객체를 가져와 인증된 사용자 정보를 얻는다.

 

3. 세션 무효화

SecurityContextLogoutHandler는 HttpSession.invalidate()를 호출하여 세션을 무효화시킨다.

세션 무효화는 서버에서 사용자 정보를 삭제하는 것으로, 더 이상 세션을 사용할 수 없게 만든다.

 

4. 쿠키 삭제

SecurityContextLogoutHandler는 HttpServleetRequest.getCookies()를 사용하여 쿠키 목록을 가져온다.

가져온 쿠키 목록에서 로그인 정보와 관련된 쿠키를 삭제한다.

 

5. SecurityContext 객체 삭제

SecurityContextLogoutHandler는 SecurityContextHolder.clearContext()를 호출하여 SecurityContext 객체를 삭제한다.

SecurityContext 객체는 인증 정보를 담고 있으므로 인증 정보가 삭제된다.

 

6. 로그아웃 성공 처리

SecurityContextLogoutHandler는 로그아웃 처리가 완료되면 로그아웃 성공 페이지로 리다이렉트 한다.

 

 

 

 

 

 

사진 출처 : https://velog.io/@songs4805/Spring-Security-%EA%B8%B0%EB%B3%B8-API-%EB%B0%8F-Filter-%EC%9D%B4%ED%95%B4