300===Dev Framework/Spring Security

Spring Security 깊이 알아보기 🛡️

블로글러 2024. 11. 17. 09:04

안녕하세요! 오늘은 Spring Security에 대해 자세히 알아보겠습니다.

Spring Security란? 🤔

Spring Security는 Spring 기반 애플리케이션의 보안을 담당하는 강력한 프레임워크입니다.
마치 건물의 보안 시스템처럼, 애플리케이션의 모든 접근을 감시하고 제어합니다.

핵심 개념 📚

1. Authentication (인증)

public interface Authentication {
    Collection<? extends GrantedAuthority> getAuthorities();
    Object getCredentials();
    Object getDetails();
    Object getPrincipal();
    boolean isAuthenticated();
}
  • 사용자가 누구인지 확인하는 과정
  • 예: 로그인 시 아이디/비밀번호 확인

2. Authorization (인가)

@PreAuthorize("hasRole('ADMIN')")
public String adminOnly() {
    return "관리자만 접근 가능한 데이터";
}
  • 인증된 사용자가 특정 리소스에 접근할 수 있는지 확인
  • 예: 관리자 페이지는 ADMIN 권한을 가진 사용자만 접근 가능

기본 설정 방법 ⚙️

1. 의존성 추가

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 기본 설정 클래스

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }
}

인증 처리 과정 🔄

  1. 인증 필터 체인

    public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
     @Override
     public Authentication attemptAuthentication(
         HttpServletRequest request, 
         HttpServletResponse response) {
         // 인증 로직 구현
     }
    }
  2. 인증 관리자

    @Bean
    public AuthenticationManager authenticationManager(
     AuthenticationConfiguration config) throws Exception {
     return config.getAuthenticationManager();
    }
  3. 사용자 정보 서비스

    @Service
    public class CustomUserDetailsService implements UserDetailsService {
     @Override
     public UserDetails loadUserByUsername(String username) 
         throws UsernameNotFoundException {
         // DB에서 사용자 정보 조회
         return new User(username, password, authorities);
     }
    }

보안 기능 구현 예시 🔒

1. JWT 토큰 인증

@Component
public class JwtTokenProvider {
    private final String SECRET_KEY = "your-secret-key";

    public String createToken(Authentication authentication) {
        // JWT 토큰 생성 로직
        return Jwts.builder()
            .setSubject(authentication.getName())
            .signWith(SignatureAlgorithm.HS512, SECRET_KEY)
            .compact();
    }
}

2. 암호화

@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

실전 활용 예시 💡

1. 메서드 보안

@PreAuthorize("hasRole('ADMIN') or #userId == authentication.principal.id")
@GetMapping("/users/{userId}")
public UserDto getUser(@PathVariable Long userId) {
    return userService.getUser(userId);
}

2. OAuth2 소셜 로그인

@Configuration
public class OAuth2Config extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .oauth2Login()
                .userInfoEndpoint()
                    .userService(customOAuth2UserService);
    }
}

성능 최적화 팁 🚀

  1. 세션 관리

    http.sessionManagement()
     .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
     .maximumSessions(1)
     .expiredUrl("/login?expired");
  2. 캐시 설정

    @EnableCaching
    public class SecurityCacheConfig {
     @Bean
     public CacheManager cacheManager() {
         return new ConcurrentMapCacheManager("userCache");
     }
    }

주의사항 ⚠️

  1. 비밀번호 관리

    • 평문 저장 금지
    • 강력한 암호화 알고리즘 사용
  2. CORS 설정

    @Bean
    public CorsConfigurationSource corsConfigurationSource() {
     CorsConfiguration configuration = new CorsConfiguration();
     configuration.setAllowedOrigins(Arrays.asList("https://example.com"));
     configuration.setAllowedMethods(Arrays.asList("GET", "POST"));
     return new UrlBasedCorsConfigurationSource();
    }

참고자료 📚

  1. Spring Security 공식 문서: https://docs.spring.io/spring-security/reference/
  2. Spring Security Architecture: https://spring.io/guides/topicals/spring-security-architecture/
  3. OWASP Security Guidelines: https://owasp.org/www-project-top-ten/
728x90