본문 바로가기
Spring/09. spring-security

Spring Security는 로그인 & 로그아웃을 위한 API인가?

by 989898 2025. 3. 5.

Spring Security는 결국 로그인 & 로그아웃을 위한 API인가?

✔️ 아니요! Spring Security는 로그인 & 로그아웃 기능만 제공하는 것이 아니라, 애플리케이션의 전체 보안(Security)을 책임지는 프레임워크입니다.


✔️ 즉, 인증(Authentication)뿐만 아니라 인가(Authorization), 세션 관리, 요청 필터링, 암호화, CSRF 보호 등 다양한 보안 기능을 포함합니다.


1. Spring Security의 핵심 역할 (로그인 & 로그아웃 외에도 다양한 보안 기능 제공)

역할 설명 관련 기능
1️⃣ 인증(Authentication) 사용자의 신원을 확인 (로그인) .formLogin(), .oauth2Login()
2️⃣ 인가(Authorization) 사용자별 접근 권한 관리 .authorizeHttpRequests(), @PreAuthorize
3️⃣ 세션 관리(Session Management) 중복 로그인 방지, 세션 고정 공격 방지 .sessionManagement(), .maximumSessions()
4️⃣ 요청 필터링(Filter Chain) 보안 필터를 활용한 요청 가로채기 SecurityFilterChain, OncePerRequestFilter
5️⃣ 암호화(Encryption) 비밀번호 및 데이터 암호화 PasswordEncoder
6️⃣ CSRF 보호 CSRF 공격 방지 .csrf().enable()
7️⃣ JWT & OAuth2 지원 토큰 기반 인증 및 소셜 로그인 .oauth2Login(), JWT Filter

 

📌 즉, Spring Security는 로그인 & 로그아웃뿐만 아니라, 애플리케이션의 보안을 전반적으로 관리하는 역할을 수행하는 강력한 보안 프레임워크입니다.


2. Spring Security는 로그인 & 로그아웃 외에 무엇을 더 할 수 있는가?

🔹 (1) 인증(Authentication) - 로그인 기능

✔️ 사용자가 로그인할 수 있도록 폼 로그인, 소셜 로그인(OAuth2), JWT 기반 인증 등을 제공
✔️ AuthenticationManager, UserDetailsService, PasswordEncoder 등을 통해 인증 수행

http
    .formLogin(form -> form
        .loginPage("/login") // 커스텀 로그인 페이지 지정
        .loginProcessingUrl("/loginProc") // 로그인 요청 처리 URL
    );

🔹 (2) 인가(Authorization) - 사용자별 권한 관리

✔️ 로그인한 사용자라도 **권한(Role)**이 있어야 특정 페이지에 접근 가능하도록 설정
✔️ hasRole("ADMIN"), @PreAuthorize("hasRole('ADMIN')") 등을 통해 세부적인 권한 제어 가능

http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/admin").hasRole("ADMIN") // 🔥 ADMIN만 접근 가능
        .anyRequest().authenticated() // 그 외 모든 요청은 로그인 필요
    );

🔹 (3) 세션 관리(Session Management)

✔️ 동일 계정으로 여러 번 로그인 방지 (.maximumSessions(1))
✔️ 로그인할 때마다 세션을 새로 생성하여 세션 고정 공격 방지

http
    .sessionManagement(session -> session
        .sessionFixation().migrateSession() // 세션 고정 공격 방지
        .maximumSessions(1) // 중복 로그인 방지
    );

🔹 (4) 요청 필터링 (Request Filtering)

✔️ 모든 요청을 보안 필터 체인(Security Filter Chain)을 통해 검사
✔️ 특정 요청을 가로채서 추가적인 검증이 가능 (예: JWT 토큰 인증)

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http.addFilterBefore(new JwtAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class);
    return http.build();
}

🔹 (5) CSRF 보호 (Cross-Site Request Forgery)

✔️ CSRF 공격을 방어하는 기능 제공
✔️ REST API에서는 필요 없을 수도 있으므로 .csrf().disable() 설정 가능

http.csrf(csrf -> csrf.disable()); // CSRF 보호 비활성화 (REST API에서 주로 사용)

🔹 (6) 비밀번호 암호화 (Password Encoding)

✔️ 비밀번호를 안전하게 저장하도록 암호화 지원 (BCrypt 기본 제공)
✔️ 로그인 시 입력한 비밀번호와 저장된 암호화된 비밀번호 비교

@Bean
public PasswordEncoder passwordEncoder() {
    return PasswordEncoderFactories.createDelegatingPasswordEncoder();
}

🔹 (7) JWT & OAuth2 로그인

✔️ 세션 기반 인증 대신, JWT 토큰을 사용한 인증 적용 가능
✔️ OAuth2 소셜 로그인(Google, Facebook, Kakao 등) 지원

http.oauth2Login();

3. 결론: Spring Security는 로그인 & 로그아웃을 위한 API인가?

🚀 🔥 아니요! Spring Security는 애플리케이션 보안을 전반적으로 관리하는 보안 프레임워크입니다.

✔️ 로그인 & 로그아웃 기능을 제공하는 것은 기본적인 역할 중 하나일 뿐
✔️ 인증(로그인), 인가(권한 관리), 세션 관리, 보안 필터링, 암호화 등 다양한 보안 기능을 포함
✔️ 세션이 아닌 JWT 기반 인증, OAuth2 소셜 로그인, CSRF 보호 등도 가능


Spring Security의 역할이 .authorizeHttpRequests(), 로그인, 로그아웃 설정으로 끝나는가?

✔️ 결론부터 말하면, 대부분의 경우, 맞습니다!
✔️ Spring Security의 주요 역할
1️⃣ 인증이 필요한 페이지와 불필요한 페이지를 구분하고 (.authorizeHttpRequests())
2️⃣ 로그인 및 로그아웃 동작을 정의하는 것 (.formLogin(), .logout())

📌 즉, 기본적인 로그인 기반 인증(세션 인증)만 사용한다면, 이 설정이 Spring Security의 역할의 대부분을 차지합니다.
📌 하지만, 추가적인 보안 기능이 필요할 경우 더 많은 설정이 필요할 수도 있습니다.


1. Spring Security의 핵심 역할

기능 관련 설정
🔹 페이지별 접근 권한 설정 .authorizeHttpRequests()
🔹 로그인 페이지 및 인증 처리 .formLogin()
🔹 로그아웃 처리 및 후속 동작 .logout()
🔹 세션 관리 (중복 로그인 방지, 세션 고정 공격 방지) .sessionManagement()
🔹 비밀번호 암호화 및 인증 검증 PasswordEncoder, AuthenticationManager

2. 기본적인 설정만 하면 끝나는 경우

아래와 같은 기본 설정을 하면 Spring Security의 주요 기능은 완료된 것으로 볼 수 있습니다.

http
    .authorizeHttpRequests(auth -> auth
        .requestMatchers("/", "/login", "/public/**").permitAll() // 누구나 접근 가능
        .requestMatchers("/admin").hasRole("ADMIN") // ADMIN만 접근 가능
        .anyRequest().authenticated() // 그 외 모든 요청은 로그인 필요
    )
    .formLogin(form -> form
        .loginPage("/login") // 로그인 페이지 지정
        .loginProcessingUrl("/loginProc") // 로그인 요청 처리
        .defaultSuccessUrl("/index", true) // 로그인 성공 후 이동할 페이지
    )
    .logout(logout -> logout
        .logoutUrl("/logout") // 로그아웃 요청 URL
        .logoutSuccessUrl("/login?logout") // 로그아웃 후 이동할 페이지
        .invalidateHttpSession(true) // 세션 무효화
        .deleteCookies("JSESSIONID") // 쿠키 삭제
    )
    .sessionManagement(session -> session
        .sessionFixation().migrateSession() // 세션 고정 공격 방지
        .maximumSessions(1) // 중복 로그인 방지
    );

 

📌 위 설정만 하면 Spring Security가 알아서 모든 로그인 & 로그아웃 기능을 처리해줌!
📌 개발자는 로그인, 로그아웃 UI만 만들면 됨.


3. 추가적인 설정이 필요한 경우

🔹 JWT 인증을 적용할 경우

  • 세션 대신 JWT 토큰을 사용하면 .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 설정 필요
  • .authorizeHttpRequests()만으로는 충분하지 않으며, JWT 필터를 추가해야 함

🔹 OAuth2 로그인 (소셜 로그인)

  • .oauth2Login() 설정을 추가해야 함
  • 카카오, 구글, 네이버 같은 소셜 로그인 연동 시 추가 설정이 필요

🔹 세션을 사용하지 않는 REST API

  • .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS) 설정 필요
  • API 인증을 위해 Bearer Token 방식 적용 필요

4. 결론

✔️ 단순한 세션 기반 로그인/로그아웃 인증이라면, .authorizeHttpRequests(), .formLogin(), .logout() 설정으로 Spring Security의 역할은 끝
✔️ 하지만, JWT 인증, OAuth2 로그인, REST API 보안 등 추가적인 보안 기능이 필요하다면 추가 설정이 필요