안녕하세요! 오늘은 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();
}
}
인증 처리 과정 🔄
인증 필터 체인
public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter { @Override public Authentication attemptAuthentication( HttpServletRequest request, HttpServletResponse response) { // 인증 로직 구현 } }
인증 관리자
@Bean public AuthenticationManager authenticationManager( AuthenticationConfiguration config) throws Exception { return config.getAuthenticationManager(); }
사용자 정보 서비스
@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);
}
}
성능 최적화 팁 🚀
세션 관리
http.sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .maximumSessions(1) .expiredUrl("/login?expired");
캐시 설정
@EnableCaching public class SecurityCacheConfig { @Bean public CacheManager cacheManager() { return new ConcurrentMapCacheManager("userCache"); } }
주의사항 ⚠️
비밀번호 관리
- 평문 저장 금지
- 강력한 암호화 알고리즘 사용
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(); }
참고자료 📚
- Spring Security 공식 문서: https://docs.spring.io/spring-security/reference/
- Spring Security Architecture: https://spring.io/guides/topicals/spring-security-architecture/
- OWASP Security Guidelines: https://owasp.org/www-project-top-ten/
728x90
'300===Dev Framework > Spring Security' 카테고리의 다른 글
RSA 패딩과 보안 취약점: PKCS#1 v1.5의 위험성 😱 (0) | 2024.12.03 |
---|---|
OAuth Introduced (0) | 2024.06.17 |