[One Day One Question]
CSRF공격에 대해서 설명해 주세요.
CSRF(Cross-Site Request Forgery, 사이트 간 요청 위조) 공격은 사용자가 신뢰하는 웹사이트를 대상으로, 공격자가 의도하지 않은 요청을 전송하도록 유도하는 보안 취약점입니다. 즉, 사용자의 권한을 악용하여 원치 않는 행동을 수행하게 만드는 공격 방식입니다.
1. CSRF 공격
- 공격자는 사용자가 이미 로그인된 웹사이트에서 특정 요청을 실행하도록 조작합니다.
- 예를 들어, 사용자가 은행 웹사이트에 로그인한 상태에서 공격자가 만든 악성 링크를 클릭하면, 공격자가 설정한 계좌로 돈을 이체하는 요청이 사용자 모르게 실행될 수 있습니다.
- 이 공격은 사용자의 인증 정보(세션 쿠키, 토큰 등) 를 악용하여 실행됩니다.
2. CSRF 공격 예시
은행 웹사이트 계좌 이체 조작
- 사용자가 A 은행 웹사이트에 로그인하고, 세션 쿠키가 유지된 상태로 다른 웹사이트를 방문함
- 공격자는 사용자가 악성 웹사이트를 방문하거나 이메일을 클릭하도록 유도함
- 악성 웹사이트에 포함된 코드가 A 은행으로 요청을 자동 전송하여 사용자의 계좌에서 공격자의 계좌로 송금하게 만듦
<img src="https://bank.com/transfer?to=attacker&amount=100000" />
3. CSRF 공격 방어 방법
1. CSRF 토큰 사용
CSRF 토큰은 공격자가 임의로 요청을 보낼 수 없도록 각 요청마다 고유한 값을 요구하는 방식입니다. 이를 통해 서버는 요청이 진짜 사용자가 의도한 것인지, 아니면 외부에서 악의적으로 유도한 것인지 구분할 수 있습니다.
CSRF 토큰 구현
- 서버는 클라이언트에게 요청을 보낼 때마다 고유한 CSRF 토큰을 생성하여 HTML 폼에 포함시킵니다.
- 사용자가 폼을 제출할 때 이 토큰도 함께 서버로 전송되며, 서버는 이 토큰을 검증합니다.
- 요청에 포함된 토큰이 서버에서 생성한 값과 일치하지 않으면 요청을 거부합니다.
<form method="post" action="/update_profile">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}">
<input type="text" name="username" value="new_username">
<input type="submit" value="Update">
</form>
서버는 이 토큰을 세션에 저장하고, 요청 시 전달된 토큰이 세션과 일치하는지 확인합니다. 일치하지 않으면 요청을 거부합니다.
2. SameSite 쿠키 속성 사용
SameSite 쿠키 속성은 브라우저가 외부 사이트에서 전송된 쿠키를 요청에 포함시키지 않도록 설정할 수 있습니다. 이를 통해 악성 웹사이트가 사용자의 인증 세션을 조작하는 것을 방지할 수 있습니다.
SameSite 속성 값
- Strict: 쿠키는 오직 동일한 사이트에서만 전송됩니다. 다른 사이트에서 요청을 보낼 때는 쿠키가 전송되지 않습니다.
- Lax: 기본적으로 쿠키는 외부 사이트에서 요청을 보낼 때 전송되지 않지만, GET 요청에는 전송됩니다. 일반적으로 사용자 로그인이 필요한 경우에 적용합니다.
- None: 쿠키는 동일한 사이트 외에도 모든 사이트에서 요청 시 전송됩니다. 이 옵션은 보안적으로 가장 취약하므로, Secure 속성과 함께 사용해야 합니다.
3. Referer와 Origin 헤더 검증
요청을 보낸 웹사이트의 출처를 나타내는 Referer 헤더와 Origin 헤더를 검사하여 요청이 신뢰할 수 있는 출처에서 온 것인지 확인할 수 있습니다. CSRF 공격은 종종 외부 사이트에서 발생하므로, 해당 헤더를 확인함으로써 이를 차단할 수 있습니다.
Referer와 Origin 헤더 검증
- Referer: 요청이 발생한 페이지의 URL을 포함합니다. 이를 통해 요청이 유효한 페이지에서 발생했는지 확인할 수 있습니다.
- Origin: 요청이 발생한 출처(도메인)만 포함됩니다. 이 값을 통해 외부 도메인에서 발생한 요청을 차단할 수 있습니다.
4. 사용자 재인증 (2차 인증)
중요한 작업을 수행할 때, 사용자가 이미 로그인 상태일지라도 추가 인증을 요구하는 방법입니다. 예를 들어, 비밀번호 변경, 계좌 이체, 이메일 주소 변경 등의 중요한 작업을 처리할 때, 사용자에게 추가로 비밀번호를 입력하게 하거나 **2단계 인증(2FA)**을 요구할 수 있습니다.
예시
- 비밀번호 변경 시, 사용자는 현재 비밀번호를 다시 입력해야 합니다.
- 계좌 이체 시, 인증 코드나 OTP(One Time Password)를 요구할 수 있습니다.
이 방법은 CSRF 공격이 발생하더라도 중요한 작업을 보호할 수 있습니다.
'cs > ODOQ' 카테고리의 다른 글
[ODOQ] 정적 IP 주소 할당 방식, 동적 IP 주소 할당 방식 (0) | 2025.02.26 |
---|---|
[ODOQ] NAT (0) | 2025.02.25 |
[ODOQ] 캐시 스탬피드(Cache Stampede) (0) | 2025.01.23 |
[ODOQ] 지연로딩, 즉시로딩 (0) | 2025.01.19 |
[ODOQ] 스케일 업(Scale-Up) , 스케일 아웃(Scale-Out) (0) | 2025.01.17 |