반응형

웹 애플리케이션에서 해킹 방지를 위해 다양한 방식을 조합하여 사용해야 합니다. 주요 방지 기법에는 SQL 인젝션 방지, CSRF 방지, XSS 방지, 파일 업로드 보안, 인증 및 권한 관리 등이 포함됩니다. 아래에 각각의 해킹 방지 기술을 코드 예제와 함께 상세히 설명합니다.


1. SQL Injection 방지

SQL Injection은 사용자가 입력한 값을 통해 데이터베이스 명령을 조작하는 공격입니다. 이를 방지하려면 Prepared Statement를 사용해야 합니다.

Java 코드 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class SqlInjectionPrevention {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydb";
        String user = "root";
        String password = "password";
        String userInput = "' OR 1=1 --";

        try (Connection conn = DriverManager.getConnection(url, user, password)) {
            String query = "SELECT * FROM users WHERE username = ? AND password = ?";
            PreparedStatement pstmt = conn.prepareStatement(query);
            pstmt.setString(1, "admin");
            pstmt.setString(2, userInput); // 안전하게 입력값 바인딩

            ResultSet rs = pstmt.executeQuery();

            if (rs.next()) {
                System.out.println("Login successful!");
            } else {
                System.out.println("Invalid username or password.");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

보안 포인트

  • Prepared Statement는 입력값을 SQL 명령어와 분리하여 실행합니다.
  • 사용자 입력값은 자동으로 이스케이핑 처리됩니다.

2. CSRF (Cross-Site Request Forgery) 방지

CSRF는 사용자가 인증된 상태에서 공격자가 의도한 요청을 전송하도록 유도하는 공격입니다. 이를 방지하려면 CSRF 토큰을 사용해야 합니다.

Spring Security 설정 예제

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
            .and()
            .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated();
    }
}

HTML Form 예제

<form method="post" action="/submit">
    <input type="hidden" name="_csrf" value="${_csrf.token}" />
    <input type="text" name="name" />
    <button type="submit">Submit</button>
</form>

보안 포인트

  • CSRF 토큰은 매 요청마다 서버와 클라이언트 간에 확인됩니다.
  • Spring Security는 자동으로 CSRF 토큰을 생성 및 검증합니다.

3. XSS (Cross-Site Scripting) 방지

XSS는 악성 스크립트를 삽입하여 실행하는 공격입니다. 이를 방지하려면 입출력 값 필터링출력 이스케이핑이 필요합니다.

Java 코드 예제 (Apache Commons Text)

import org.apache.commons.text.StringEscapeUtils;

public class XssPreventionExample {
    public static void main(String[] args) {
        String userInput = "<script>alert('Hacked!');</script>";

        // 사용자 입력 이스케이핑
        String safeOutput = StringEscapeUtils.escapeHtml4(userInput);

        System.out.println("Safe Output: " + safeOutput);
    }
}

출력 결과

Safe Output: &lt;script&gt;alert(&#39;Hacked!&#39;);&lt;/script&gt;

4. 파일 업로드 보안

파일 업로드는 해커가 악성 스크립트를 서버에 업로드하여 실행하도록 유도할 수 있습니다. 파일 검증 및 제한된 디렉터리 사용이 필수입니다.

Spring Controller 예제

import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;

@RestController
public class FileUploadController {
    @PostMapping("/upload")
    public String uploadFile(MultipartFile file) throws IOException {
        String filename = file.getOriginalFilename();
        if (filename == null || !filename.matches("^[a-zA-Z0-9._-]+$")) {
            return "Invalid file name.";
        }

        File uploadDir = new File("uploads");
        if (!uploadDir.exists()) {
            uploadDir.mkdir();
        }

        file.transferTo(new File(uploadDir, filename));
        return "File uploaded successfully.";
    }
}

보안 포인트

  • 파일 이름을 검증하여 악성 파일을 필터링합니다.
  • 파일은 제한된 디렉터리에 저장하며 실행 권한을 제거합니다.

5. 강화된 인증 및 권한 관리

인증과 권한 관리는 해킹 방지의 핵심 요소입니다.

Spring Security 예제

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .formLogin()
            .loginPage("/login")
            .permitAll()
            .and()
            .logout()
            .permitAll();
    }

    @Bean
    @Override
    protected UserDetailsService userDetailsService() {
        User.UserBuilder users = User.withDefaultPasswordEncoder();
        return new InMemoryUserDetailsManager(
            users.username("user").password("password").roles("USER").build(),
            users.username("admin").password("admin").roles("ADMIN").build()
        );
    }
}

보안 포인트

  • 역할 기반 접근 제어(RBAC)를 통해 페이지 접근 권한을 제한합니다.
  • Spring Security는 자동으로 세션 관리를 처리하여 인증 정보를 보호합니다.

6. HTTP 보안 헤더 설정

HTTP 헤더는 애플리케이션에 대한 추가적인 보안 계층을 제공합니다.

Spring Security 설정 예제

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.headers()
            .xssProtection().block(true)
            .and()
            .contentSecurityPolicy("script-src 'self'");
    }
}

보안 포인트

  • X-Content-Type-Options: 브라우저가 파일 형식을 잘못 해석하지 않도록 방지.
  • X-Frame-Options: 클릭재킹 방지.
  • Content-Security-Policy(CSP): 스크립트 및 리소스 로드를 제한.

위 기술들을 조합하여 사용하면 웹 애플리케이션의 보안을 대폭 강화할 수 있습니다. 특히 전자정부프레임워크에서 Spring 기반의 보안 설정을 활용하면 추가적인 보안 계층을 구현하기 용이합니다.

반응형

+ Recent posts