728x90
반응형
1. CORS & 동일 출처 정책 (SOP)
🔒 동일 출처 정책 (SOP, Same-Origin Policy)
- 정의: 브라우저가 '스크립트가 로드된 출처(프론트엔드)'와 '동일한 출처'의 리소스에만 접근할 수 있도록 제한하는 아주 강력한 보안 규칙.
- 출처(Origin) 기준: [프로토콜] + [도메인] + [포트] 3가지가 모두 같아야 동일 출처로 인정. (예: localhost:3000과 localhost:8080은 포트가 달라 다른 출처)
- 존재 이유: 사악한 사이트(hacker.com)의 스크립트가 사용자의 브라우저 권한을 악용해 네이버나 은행 등 다른 사이트의 데이터를 마음대로 조회/변조하는 대참사를 막기 위함.
🌐 CORS (Cross-Origin Resource Sharing)
- 정의: 기본적으로 다른 출처로의 접근을 막는 브라우저 환경에서, 안전하게 다른 출처의 리소스에 접근할 수 있도록 허용해 주는 보안 기능(정책).
- 동작: 백엔드 서버가 응답 헤더(Access-Control-Allow-Origin)에 *"이 프론트엔드 출처는 허락해 줄게"*라고 명시하면 브라우저가 차단을 풀고 데이터를 통과시켜 줌.
2. Preflight (예비 요청)
- 정의: 브라우저가 진짜 요청(Main Request)을 보내기 전에, 백엔드 서버에 미리 안전한지 간을 보는 예비 요청.
- 특징:
- 개발자가 코드를 짜지 않아도 브라우저가 100% 자동으로 수행.
- HTTP OPTIONS 메서드를 사용해 서버의 CORS 허용 여부를 미리 체크함.
- 존재 이유: 복잡한 요청(JSON 데이터 전송, Custom 헤더 포함 등)이 검증 없이 냅다 서버로 날아가서 서버의 데이터를 오염시키거나 리소스를 낭비하는 것을 방지하기 위해 서버 보호 차원에서 실행됨.
3. CSRF (Cross-Site Request Forgery, 사이트 간 요청 위조)
❓ CSRF란?
- 사용자가 자신의 의지와는 무관하게, 공격자가 의도한 행위(수정, 삭제, 등록 등)를 특정 웹사이트에 요청하게 만드는 공격.
- 예시: 사용자가 은행 사이트에 로그인되어 있는 상태(브라우저에 쿠키가 남아있음)에서 해커가 만든 낚시 사이트에 접속하면, 낚시 사이트 내의 스크립트가 사용자의 브라우저를 이용해 은행 서버로 *"해커 계좌로 100만 원 송금해 줘"*라는 요청을 강제로 날림. 서버는 로그인된 정상적인 요청으로 착각하고 수행함.
🛡️ 방지 방법
- CSRF 토큰 사용: 서버가 사용자의 세션(혹은 폼)마다 난수 값(Token)을 발행하고, 요청이 올 때마다 그 토큰이 일치하는지 검증하는 방식. 해커의 낚시 사이트는 이 토큰 값을 알 수 없으므로 공격이 차단됨.
- SameSite 쿠키 설정: 쿠키의 SameSite 속성을 Strict나 Lax로 설정하여, 다른 사이트에서 출발한 요청에는 쿠키가 자동으로 실려 가지 않도록 차단.
4. XSS (Cross-Site Scripting, 사이트 간 스크립팅)
❓ XSS란?
- 공격자가 웹사이트에 악성 스크립트(JavaScript)를 삽입하여, 이를 열람하는 다른 사용자의 브라우저에서 실시간으로 실행되게 만드는 공격.
- 예시: 게시판 글 제목에 <script>해킹코드</script>를 적어두면, 다른 사용자들이 그 게시글 목록을 조회하는 순간 브라우저가 저 코드를 자바스크립트로 인식하고 실행해 버림. 이를 통해 세션 쿠키를 탈취하거나 페이지를 변조함.
🛡️ 방어 방법
- HTML 이스케이프(Escape) 처리: 입력되거나 출력되는 문자열 중 기호(<, >, & 등)를 문자 형태(<, >, &)로 치환하여, 브라우저가 코드가 아닌 단순 '텍스트'로 인식하게 만듦. (예: 네이버 Lucene Lucy Filter 같은 라이브러리 활용)
- CSP (Content Security Policy) 설정: 웹 페이지에서 실행할 수 있는 스크립트의 출처를 헤더를 통해 엄격하게 제한.
5. SQL Injection (SQL 인젝션)
❓ SQL Injection이란?
- 사용자의 입력창(로그인 폼, 검색창 등)에 악의적인 SQL 구문을 주입하여, 백엔드 데이터베이스(DB)의 데이터를 비정상적으로 조작, 탈취, 삭제하는 공격.
- 예시: 로그인 아이디 입력창에 ' OR '1'='1 같은 구문을 쑤셔 넣어, 서버의 SQL 쿼리 구조를 완전히 망가뜨리고 패스워드 검증 없이 무조건 무사통과(로그인 성공)하게 만듦.
🛡️ 방어 방법
- 정적 쿼리 사용 (Prepared Statement): SQL 쿼리 틀을 미리 컴파일해 두고 사용자의 입력값은 단순 '파라미터(데이터)'로만 바인딩 처리하는 방식. 입력값에 SQL 문법이 들어있어도 절대 코드로 실행되지 않음. (MyBatis의 #{} 방식이 이에 해당, ${}는 취약함).
- 입력값 검증: 아이디나 검색어에 SQL 특수문자가 들어오지 못하도록 서버 단에서 필터링.
반응형
'Study' 카테고리의 다른 글
| [내일배움캠프 TIL] SAGA 패턴 (0) | 2026.06.05 |
|---|---|
| 면접과 탈락까지 후기(넋두리..) : 끝날때 까지 끝난게 아니다.. (0) | 2026.06.05 |
| [내일배움캠프 TIL] 32일차 - 단위테스트와 Mock Mvc의 이해 (0) | 2026.05.20 |
| [내일배움캠프 TIL] 31일차 - flyway를 이용한 DB 마이그레이션 자동화 (0) | 2026.05.19 |
| [내일배움캠프 TIL] 30일차 - Arch unit (0) | 2026.05.18 |