Java Framework/Spring Security

[Spring Security] 보안

annovation 2025. 2. 15. 10:12

1. CSRF (Cross-Site Request Forgery)

  • CSRF는 사용자가 의도하지 않은 요청을 서버로 전송하도록 속이는 공격입니다. 로그인 상태의 사용자를 대상으로 악성 요청을 실행할 수 있어 보안에 매우 위험합니다.
  • ex. 사용자가 은행 웹사이트에 로그인한 상태에서 악성 링크를 클릭하면, 공격자가 사용자 계정으로 돈을 송금하는 요청이 전송될 수 있습니다.

1. Spring Security의 CSRF 방지

  • Spring Security를 사용하면 CSRF 보호가 기본으로 활성화됩니다.
  • POST, PUT, DELETE 등의 요청 시, CSRF 토큰을 요구합니다.

2. 예시

<form action="/submit" method="post">
    <input type="hidden" name="_csrf" value="1a2b3c4d5e6f7g8h9i0j">
    <button type="submit">Submit</button>
</form>

 

  • name="_csrf": 서버에서 지정한 CSRF 토큰의 파라미터 이름
  • value="1a2b3c4d5e6f7g8h9i0j": 서버가 생성한 고유 토큰 값

2. X-Frame-Options 헤더

  • 웹 페이지가 다른 사이트의 iframe에서 로드되지 않도록 방지하는 HTTP 응답 헤더입니다.
    • iframe : HTML 문서 안에 다른 HTML 페이지를 삽입할 수 있는 태그입니다.

1. 특징

  • 클릭재킹(Clickjacking) 공격을 막기 위해 사용됩니다.
    • 클릭재킹이란 사용자가 의도하지 않은 버튼이나 링크를 클릭하도록 속이는 공격입니다.
    • ex. 공격자가 자신의 웹사이트에 은행의 로그인 페이지를 iframe으로 삽입한 뒤, 투명한 버튼을 겹쳐서 사용자가 클릭하도록 유도합니다.

2. 예시

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.headers(headers -> headers
        .frameOptions(frameOptions -> frameOptions.sameOrigin())); // 같은 도메인에서만 iframe 허용
}
  • SAMEORIGIN : 같은 도메인에서만 iframe으로 로드 가능
  • DENY : iframe 로드를 완전히 차단

BCryptPasswordEncoder

  • 비밀번호를 안전하게 저장하기 위해 사용하는 해시 함수입니다.
  • Salt(랜덤 데이터)를 추가해 동일한 비밀번호라도 서로 다른 암호화 결과를 생성합니다.
  • 암호화는 단방향으로만 동작하며, 원래 비밀번호를 복구할 수 없습니다.
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

PasswordEncoder 인터페이스

  • 비밀번호를 암호화하거나, 사용자가 입력한 비밀번호와 암호화된 비밀번호를 비교하는 역할을 합니다.

1. 주요 메서드

  • encode(String rawPassword) : 평문 비밀번호를 암호화
  • matches(CharSequence rawPassword, String encodedPassword) : 입력한 비밀번호와 저장된 암호화 비밀번호가 일치하는지 확인

2. 예시

PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
String encodedPassword = passwordEncoder.encode("myPassword");
boolean matches = passwordEncoder.matches("myPassword", encodedPassword); // true

출처

OpenAI ChatGPT (https://openai.com)