웹 보안 / / 2024. 10. 26. 14:58

웹 보안 방어 정리

웹 보안 방어 기법 정리

1. HTTPS

웹 보안의 첫 단계는 HTTPS를 적용하여 데이터 전송 중 도청 및 변조를 방지하는 것입니다. 하지만 HTTPS만으로는 방어할 수 없는 애플리케이션 레벨의 공격이 있기 때문에 추가적인 보안 대책이 필요합니다.


2. 애플리케이션 레벨 공격 방어

  1. SQL Injection 방어
    • SQL Injection은 악의적인 SQL 쿼리를 입력하여 데이터베이스에 접근하거나 데이터를 탈취하는 공격입니다. 방어 방법으로는 다음과 같은 기법이 있습니다:
      • Prepared Statements: SQL 쿼리에서 사용자 입력을 매개변수로 받는 준비된 문장(Prepared Statements)을 사용해 직접적인 쿼리 삽입을 방지합니다.
      예시 코드: 안전한 Prepared Statements 사용
      • ORM/ODM 사용: 직접 쿼리 작성 대신 ORM(Object-Relational Mapping)이나 MongoDB에서는 ODM(Object-Document Mapping)을 사용해 SQL Injection을 방지할 수 있습니다. **mongoose**의 경우에도 쿼리 입력을 안전하게 바인딩하도록 설정합니다.
      • 입력 검증: 입력 값의 형식을 검증하여 SQL에 부적절한 값이 전달되지 않도록 합니다. 정규식 등을 활용하여 허용된 값만 입력받도록 필터링합니다.
    • import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.SQLException;
      
      public class MemberDAO {
      
          // 회원 등록
          public int insertMember(MemberVO mVo) {
              int result = -1;
              String sql = "INSERT INTO member(userid, pwd, name, birthdate, email, admin) VALUES(?, ?, ?, ?, ?, ?)";
              try (Connection conn = DBManager.getConnection();
                   PreparedStatement pstmt = conn.prepareStatement(sql)) {
                  pstmt.setString(1, mVo.getUserid());
                  pstmt.setString(2, mVo.getPwd());
                  pstmt.setString(3, mVo.getName());
                  pstmt.setString(4, mVo.getBirthdate());
                  pstmt.setString(5, mVo.getEmail());
                  pstmt.setInt(6, mVo.getAdmin());
                  result = pstmt.executeUpdate();
              } catch (SQLException e) {
                  e.printStackTrace();
              }
              return result;
          }
      }
  2. XSS(Cross-Site Scripting) 방어
    • XSS는 사용자가 입력한 악성 스크립트가 웹 페이지에서 실행되어, 다른 사용자에게 악영향을 줄 수 있는 공격입니다.
      • 출력 인코딩: 특수 문자를 HTML로 출력할 때 인코딩하여 악성 스크립트 실행을 방지합니다.
      • 예시 코드:
      • function escapeHtml(str) {
            return str.replace(/&/g, '&')
                      .replace(/</g, '&lt;')
                      .replace(/>/g, '&gt;')
                      .replace(/"/g, '&quot;')
                      .replace(/'/g, '&#039;');
        }
      • 예시 코드: XSS 방어용 HTML 인코딩 함수 사용
    • const userComment = '<script>alert("XSS")</script>';
      const safeComment = escapeHtml(userComment);
      document.getElementById('comments').innerHTML += `<div>${safeComment}</div>`;
       
      • Content Security Policy (CSP): Content Security Policy를 설정해 스크립트와 리소스를 허용된 도메인에서만 로드하게 제한합니다.
      • <head>
            <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://trusted-cdn.com;">
        </head>
      • React 사용 시 주의사항: React에서는 dangerouslySetInnerHTML 함수를 사용하는 것을 자제하고, JSX 내에서는 HTML로 렌더링되는 모든 데이터를 escape 처리해야 합니다.
  3. CSRF(Cross-Site Request Forgery) 방어
    • CSRF는 사용자의 권한을 이용해 의도치 않은 요청을 보내도록 유도하는 공격입니다.
      • csurf 미들웨어 설정: CSRF 미들웨어를 통해 CSRF 토큰을 설정하고 이를 클라이언트로 전달합니다.
      • SameSite Cookie 옵션 설정SameSite 옵션을 **Strict**로 설정하여, CSRF 공격을 방지할 수 있도록 쿠키가 같은 사이트 내에서만 유효하도록 합니다.
      예시 코드: CSRF 방어 설정
const express = require('express');
const cookieParser = require('cookie-parser');
const csurf = require('csurf');

const app = express();

app.use(cookieParser());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

const csrfProtection = csurf({ cookie: true });
app.use(csrfProtection);

app.get('/api/csrf-token', (req, res) => {
  res.json({ csrfToken: req.csrfToken() });
});

app.post('/api/some-action', (req, res) => {
  res.json({ success: true });
});

app.listen(3000, () => {
  console.log('Server is running on http://localhost:3000');
});

3. 서버 측 취약점 방어

  1. 서버 소프트웨어 최신 버전 유지: 오래된 버전의 소프트웨어를 사용하는 경우 보안 취약점이 존재할 수 있습니다. 따라서 서버 소프트웨어를 항상 최신 버전으로 유지하고, 보안 패치가 나오면 빠르게 적용합니다.
  2. 설정 보안 강화: 기본 설정을 사용하지 않고, 필요하지 않은 디폴트 설정을 제거하거나 사용 중지하여 공격 노출을 줄입니다.
  3. HSTS(HTTP Strict Transport Security): **helmet**을 사용해 HSTS를 설정하여 서버에 HTTPS 강제를 적용할 수 있습니다. 이는 중간자 공격(MITM)을 예방하는 데 도움이 됩니다.
const helmet = require('helmet');
app.use(helmet.hsts({ maxAge: 63072000, includeSubDomains: true }));

4. 네트워크 레벨 공격 방어

  1. DDoS 공격 방어: 대량의 트래픽으로 서버를 과부하 상태로 만드는 DDoS 공격은 방어하기 어려운 공격 중 하나입니다. 가능한 경우 클라우드 제공업체의 DDoS 보호 서비스를 활용하는 것이 좋습니다.
  2. DNS 스푸핑 방어: DNS 스푸핑 공격은 사용자를 가짜 서버로 유도하는 공격입니다. DNS over HTTPS(DOH) 같은 보안 프로토콜을 이용해 안전하게 DNS를 설정할 수 있습니다.

5. 사용자 데이터 및 로그 관리

  1. 비밀번호 암호화: 사용자의 비밀번호는 bcrypt 같은 강력한 해싱 알고리즘을 사용해 안전하게 저장하고, 해싱된 값만 데이터베이스에 저장합니다.
  2. 로그 및 보안 모니터링: 예상치 못한 패턴의 로그인 시도나, 특정 페이지에 대한 반복적 접근 같은 의심스러운 활동을 로깅하고 분석합니다. 클라우드 제공업체나 애플리케이션의 알림 서비스를 통해 실시간으로 보안 경고를 받을 수 있도록 설정하는 것이 좋습니다.

'웹 보안' 카테고리의 다른 글

HTTPS를 왜 써야될까  (6) 2024.10.26
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유