개발 중 만난 오류들 중 CORS랑 CSRF는 유독 자주 마주치는 에러였다. 특히 JWT 같은 사용자 인증 기능을 구현하거나, 스크래핑 방어 관련 챌린지를 진행하면서 얘네가 어떤 역할을 하고, 웹 통신에서 왜 필요한지 제대로 알고 싶어졌다. 그냥 넘어가기엔 너무 자주 등장하길래 이번 기회에 확실히 정리하면 좋을 것 같다.
CSRF는 사용자가 로그인한 상태를 노려 의도치 않은 요청을 보내도록 유도하는 공격 방식이다. 공격자는 사용자의 신원을 직접적으로 도용하지 않지만, 피해자의 권한으로 악의적인 요청을 수행하게 만든다.
공격 시나리오 예시
해결 방법
CSRF 토큰 사용
SameSite 쿠키 속성 활용
SameSite=Strict 또는 Lax 옵션을 쿠키에 설정하면, 외부 도메인에서 자동으로 쿠키가 전송되지 않아 CSRF 공격을 방어할 수 있다.CSRF는 서버에서 방어해야 하는 보안 문제!
방어 기법: CSRF 토큰 / SameSite 쿠키 등
CORS는 웹 브라우저가 보안을 위해 다른 출처(origin)의 리소스에 대한 요청을 제한하는 보안 정책이다. 출처는 스킴(프로토콜), 호스트(도메인), 포트로 정의된다.
상황 예시
http://frontend.comhttp://api.backend.com해결 방법
서버에서 Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Allow-Headers 등의 CORS 관련 HTTP 헤더를 설정해 특정 도메인 또는 전체(*)에 대해 접근을 허용해야 한다.
예시 코드:
Access-Control-Allow-Origin: http://frontend.com
추가 팁
CORS 설정 미들웨어를 활용하여 관리할 수 있다.CORS는 브라우저가 자동으로 방어하는 보안 메커니즘
해결 방법: 서버에서 CORS 허용 헤더를 설정하거나 프레임워크에서 설정으로 구성
| 항목 | CSRF | CORS |
|---|---|---|
| 목적 | 악의적 요청 방지 | 출처 간 요청 제한 |
| 방어 주체 | 서버 | 브라우저 |
| 주요 해결법 | CSRF 토큰, SameSite | 서버 CORS 설정 (헤더) |
| 주 공격 조건 | 세션 쿠키 자동 전송 | 다른 출처로의 요청 |
| 기본 동작 | 브라우저는 요청 전송함 | 브라우저가 요청 자체를 차단함 (사전 요청 포함) |
방어주체가 다르다는 것을 이번 기회에 알 수 있었다!
그동안 설정해줬던 것들이 무엇이었는지 한 번 더 확인했고 웹 통신에 대한 이해를 갖고 개발을 하면 좋을 것 같다.... 🥹