Basic Spring Boot Security
고급적인 기술도 아니고, 내용도 아니지만 완전 기본적인 취약점들의 방어 방법을 러프하게 작성해보려고 합니다.
굳이 Spring Boot라고 언어 주제를 잡긴했지만, 모든 언어들에 적용되는 내용들이고 매우 기초적인 내용들입니다.
리얼월드에서는 아래 방법만으로는 막을 수 없는 수많은 취약점이 발생할 것이지만, 최소한의 방어법이라고 볼 수 있습니다.
Input validation
사용자가 제공한 입력의 충분한 검증 부족은 공격의 주요 진입점 중 하나입니다.
서버 측 검증: 클라이언트 측 검증에만 의존하면 안 됩니다.
Spring Boot의 @Valid 어노테이션을 사용하여 수신된 데이터가 올바른지 확인합니다. ESAPI 또는 OWASP Java Encoder와 같은 라이브러리를 사용하여 입력을 정리하여 교차 사이트 스크립팅(XSS) 공격을 방지합니다.
@PostMapping("/register")
public ResponseEntity registerUser(@Valid @RequestBody User user) {
// 회원 가입 처리
}
비밀번호 관리
비밀번호를 안전하게 저장하는 것은 설령 Database가 노출되더라도 최저한의 피해만을 받을 수 있으므로 매우 중요합니다.
Spring Security의 PasswordEncoder API를 사용하여 비밀번호를 안전하게 저장합니다.
bcrypt 또는 Argon2와 같은 강력한 알고리즘을 사용하여 비밀번호에 솔트를 추가하고 해싱합니다.
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
SQL Injection
Database를 가져갈 수 있는 대표적인 취약점입니다.
SQL 주입을 방지하기 위해 항상 Prepared Statements를 사용합니다.
ORM을 활용하여 수동으로 SQL 쿼리를 구성하는 것을 피합니다, 100% 안전하다고 볼 수는 없으나 수동으로 쿼리를 구성하는 것 보다는 안전할 확률이 더 높습니다.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u FROM User u WHERE u.email = :email")
Optional<User> findByEmail(@Param("email") String email);
}
Authentication
특정 기능에 대한 접근을 오직 권한이 있는 사용자만 사용할 수 있도록 보장하는 것이 필수적입니다.
OAuth2 및 OpenID Connect: OAuth2 및 OpenID Connect와 같은 현대 인증 표준을 통합하여 애플리케이션을 보호합니다.
@PreAuthorize 어노테이션을 사용하여 사용자 권한에 따라 메서드 접근을 제어합니다.
@PreAuthorize("hasRole('ADMIN')")
@GetMapping("/admin")
public String adminAccess() {
return "관리자 콘텐츠";
}
Session
세션 탈취 및 기타 공격을 방지하는 것은 기본입니다. 세션을 탈취당할 시 해당 세션의 권한에 따라 많은 피해가 발생할 수 있습니다.
세션과 인증 토큰의 만료 시간을 짧게 설정합니다.
Spring Security에서 CSRF 보호를 항상 활성화합니다.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.csrf().disable() // REST API의 경우 CSRF는 일반적으로 비활성화되지만 상황에 맞게 변경합니다.
.authorizeRequests()
.anyRequest().authenticated();
return http.build();
}
Dependency management and scanning
서드파티 의존성은 애플리케이션에 취약점을 도입할 수 있으므로, 이를 신중하게 관리하는 것이 중요합니다.
새로운 의존성을 프로젝트에 추가하기 전에 그 인기, 보안 이력 및 업데이트 빈도를 조사합니다.
OWASP Dependency-Check, Snyk, Veracode 및 Maven Dependency Vulnerability Scanner 플러그인과 같은 도구를 사용하여 의존성의 알려진 취약점을 확인합니다. 특히 Veracode는 코드베이스와 의존성 전반의 보안 위험을 스캔하고 관리하기 위한 포괄적인 플랫폼을 제공합니다.
Dependabot 또는 Renovate와 같은 도구를 사용하여 의존성을 최신 상태로 유지합니다.
주기적으로 프로젝트의 의존성을 검토하고 더 이상 필요하지 않은 것을 제거합니다.
NVD(국가 취약점 데이터베이스)와 같은 신뢰할 수 있는 출처에서 보안 경고를 구독합니다.
<build>
<plugins>
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>6.5.1</version>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>