웹 보안 방어 기법 정리
1. HTTPS
웹 보안의 첫 단계는 HTTPS를 적용하여 데이터 전송 중 도청 및 변조를 방지하는 것입니다. 하지만 HTTPS만으로는 방어할 수 없는 애플리케이션 레벨의 공격이 있기 때문에 추가적인 보안 대책이 필요합니다.
2. 애플리케이션 레벨 공격 방어
- SQL Injection 방어
- SQL Injection은 악의적인 SQL 쿼리를 입력하여 데이터베이스에 접근하거나 데이터를 탈취하는 공격입니다. 방어 방법으로는 다음과 같은 기법이 있습니다:
- Prepared Statements: SQL 쿼리에서 사용자 입력을 매개변수로 받는 준비된 문장(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; } }
- SQL Injection은 악의적인 SQL 쿼리를 입력하여 데이터베이스에 접근하거나 데이터를 탈취하는 공격입니다. 방어 방법으로는 다음과 같은 기법이 있습니다:
- XSS(Cross-Site Scripting) 방어
- XSS는 사용자가 입력한 악성 스크립트가 웹 페이지에서 실행되어, 다른 사용자에게 악영향을 줄 수 있는 공격입니다.
- 출력 인코딩: 특수 문자를 HTML로 출력할 때 인코딩하여 악성 스크립트 실행을 방지합니다.
- 예시 코드:
-
function escapeHtml(str) { return str.replace(/&/g, '&') .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, '''); }
- 예시 코드: 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 처리해야 합니다.
- XSS는 사용자가 입력한 악성 스크립트가 웹 페이지에서 실행되어, 다른 사용자에게 악영향을 줄 수 있는 공격입니다.
- 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. 서버 측 취약점 방어
- 서버 소프트웨어 최신 버전 유지: 오래된 버전의 소프트웨어를 사용하는 경우 보안 취약점이 존재할 수 있습니다. 따라서 서버 소프트웨어를 항상 최신 버전으로 유지하고, 보안 패치가 나오면 빠르게 적용합니다.
- 설정 보안 강화: 기본 설정을 사용하지 않고, 필요하지 않은 디폴트 설정을 제거하거나 사용 중지하여 공격 노출을 줄입니다.
- HSTS(HTTP Strict Transport Security): **helmet**을 사용해 HSTS를 설정하여 서버에 HTTPS 강제를 적용할 수 있습니다. 이는 중간자 공격(MITM)을 예방하는 데 도움이 됩니다.
const helmet = require('helmet');
app.use(helmet.hsts({ maxAge: 63072000, includeSubDomains: true }));
4. 네트워크 레벨 공격 방어
- DDoS 공격 방어: 대량의 트래픽으로 서버를 과부하 상태로 만드는 DDoS 공격은 방어하기 어려운 공격 중 하나입니다. 가능한 경우 클라우드 제공업체의 DDoS 보호 서비스를 활용하는 것이 좋습니다.
- DNS 스푸핑 방어: DNS 스푸핑 공격은 사용자를 가짜 서버로 유도하는 공격입니다. DNS over HTTPS(DOH) 같은 보안 프로토콜을 이용해 안전하게 DNS를 설정할 수 있습니다.
5. 사용자 데이터 및 로그 관리
- 비밀번호 암호화: 사용자의 비밀번호는 bcrypt 같은 강력한 해싱 알고리즘을 사용해 안전하게 저장하고, 해싱된 값만 데이터베이스에 저장합니다.
- 로그 및 보안 모니터링: 예상치 못한 패턴의 로그인 시도나, 특정 페이지에 대한 반복적 접근 같은 의심스러운 활동을 로깅하고 분석합니다. 클라우드 제공업체나 애플리케이션의 알림 서비스를 통해 실시간으로 보안 경고를 받을 수 있도록 설정하는 것이 좋습니다.
'웹 보안' 카테고리의 다른 글
HTTPS를 왜 써야될까 (6) | 2024.10.26 |
---|