참고 Spring Security 인증 흐름 이해하기

공통 사항 (세션 정책, 예외 처리 등)

<aside>

SecurityConfig 전체 코드

https://github.com/melly8954/auth-session/blob/main/src/main/java/com/melly/authsession/config/SecurityConfig.java

</aside>

세션 기반 로그인 흐름

일반 로그인

  1. 로그인 요청(/api/v1/auth/login)

  2. 서비스 계층(AuthServiceImpl )의 login() 호출

    1. UsernamePasswordAuthenticationToken 을 인증 요청용 토큰 ****생성
    // AuthServiceImpl.java
    UsernamePasswordAuthenticationToken authToken = 
    		new UsernamePasswordAuthenticationToken(dto.getUsername(), dto.getPassword());
    
    1. AuthenticationManager.authenticate() 호출
    // AuthServiceImpl.java
    Authentication authentication = authenticationManager.authenticate(authToken);
    
  3. CustomAuthenticationProvider 에서 사용자 조회, 비밀번호 검증, 계정 상태 체크 수행 → 인증 성공 시 인증 완료 토큰 반환

    <aside>

    CustomAuthenticationProvider 전체 코드

    https://github.com/melly8954/auth-session/blob/main/src/main/java/com/melly/authsession/common/auth/CustomAuthenticationProvider.java

    </aside>

    // CustomAuthenticationProvider.java
    return new UsernamePasswordAuthenticationToken(principalDetails, null, authorities);
    
  4. SecurityContextHolder에 저장

    // AuthServiceImpl.java
    SecurityContextHolder.getContext().setAuthentication(authentication);
    
  5. 세션에 SecurityContext 저장

    // AuthServiceImpl.java
    HttpSession session = httpRequest.getSession(true);
    
    session.setAttribute(
    			HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
    			SecurityContextHolder.getContext()
    );
    

텍스트 기반 시각화

[사용자] --- 로그인 요청 ---> [AuthController.login()]
                                      |
                                      v
                           [AuthServiceImpl.login()]
                                      |
                                      v
                    [AuthenticationManager.authenticate()]
                                      |
                                      v
                        [CustomAuthenticationProvider]
	                (사용자 조회 → 비밀번호 검증 → 권한 세팅)
                                      |
                                      v
	                       [Authentication 객체 반환]
                                      |
                                      v
                 SecurityContextHolder.setAuthentication(auth)
                                      |
                                      v
            HttpSession.setAttribute(SPRING_SECURITY_CONTEXT_KEY, auth)
                                      |
                                      v
                      [사용자에게 JSESSIONID 쿠키 전달]

OAuth2 로그인

  1. OAuth2 로그인 요청(/oauth2/authorization/{provider})
  2. OAuth2 인증 서버에서 인증