SameSite=None 쿠키 설정 (CSRF 위험)
SameSite=None Cookie
설명
민감한 쿠키에 SameSite=None을 설정하면, 교차 사이트 요청에도 해당 쿠키가 자동 전송됩니다. 별도의 CSRF 방어가 없으면 공격자가 사용자를 악성 페이지로 유도해 피해자 브라우저에서 인증 쿠키가 포함된 요청을 보내도록 만들 수 있습니다. 이로 인해 비밀번호 변경, 송금 등 상태 변경 요청이 사용자의 권한으로 실행될 수 있습니다.
잠재적 영향
CSRF 성공률 증가: 교차 사이트 요청에 인증/세션 쿠키가 포함되어, 공격자가 사용자의 권한으로 의도치 않은 요청을 실행시킬 수 있습니다.
무단 상태 변경: 비밀번호 변경, 결제/송금, 프로필 수정 등 중요한 상태 변경이 사용자의 동의 없이 수행될 수 있습니다.
계정 오남용 및 데이터 변조: 공격 대상 계정으로 스팸 발송, 설정 변경, 데이터 생성/수정/삭제가 가능해집니다.
해결 방법
민감한 쿠키에는 SameSite=Strict를 사용하세요. (최소 Lax 권장)
교차 사이트가 꼭 필요한 경우(3rd-party 임베드, SSO 등)에도 CSRF 방어를 반드시 추가하세요:
CSRF 토큰(서버 검증) 또는 Double Submit Cookie 패턴 적용
Origin/Referer 헤더 검증(특히 상태 변경 요청에 대해)
상태 변경 요청은 GET이 아닌 POST/PUT/DELETE 등으로 제한하고, 서버에서 토큰/Origin 검증 필수
Express 등에서는 res.cookie(..., { sameSite: 'strict' | 'lax', secure: true, httpOnly: true })로 설정
SameSite=None을 부득이하게 사용할 때는 반드시 Secure 속성을 함께 사용하고, 상기 CSRF 방어를 병행하세요.
취약한 코드 및 안전한 코드 예시
취약한 코드
안전한 코드
설명:
취약한 코드: SameSite=None으로 설정된 인증 쿠키는 교차 사이트 요청에도 전송됩니다. CSRF 방어(토큰 검증, Origin/Referer 확인 등)가 없으므로 공격자는 피해자 브라우저로부터 인증이 포함된 요청을 임의로 발생시켜 상태 변경을 유도할 수 있습니다.
안전한 코드: 민감한 쿠키에 SameSite=Strict를 적용하여 교차 사이트 요청 시 쿠키가 전송되지 않도록 했습니다. 추가로 Origin/Referer 검증과 CSRF 토큰 검증을 수행해, 설령 SameSite 완화나 특정 예외 상황이 있어도 무단 요청이 차단되도록 방어층을 복수로 구성했습니다.
참조
Last updated