일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- spring security 설정
- spring security
- 티스토리챌린지
- 프로그래머스 붕대 감기
- 자바의정석
- 붕대 감기
- over()
- 리눅스
- 오버라이딩
- SQL Mapper
- 입출력
- break 사용법
- continue 사용법
- 다형성
- 혼공얄코
- java
- 캡슐화
- 붕대 감기 자바
- 멀티태스킹
- 오버로딩
- 프로그래머스
- contiune
- 중첩 break
- 쿠키
- 객체지향
- CPU
- 자바의 정석
- 오블완
- 멀티프로세싱
- hackerrank
- Today
- Total
쉽게 쉽게
CSRF란? 본문
▤ 목차
Spring Security를 구현하면서 CSRF 토큰에 대해 알아봐야 겠다는 생각이 들었다.
CSRF 토큰 값을 넘겨주는 이유에 대해 알아보고자 했다.
1. CSRF란?
CSRF(Cross Site Request Forgery)란 임의의 사용자 권한으로 임의의 주소에 HTTP 요청을 하는 취약점이다.
즉 HTTP 요청에 필요한 서명을 위조, 변조하는 공격이며, 웹 서비스 이용자를 속여 의도치 않은 요청에 동의하도록 하는 공격이다.
실제 사례로 2008년 옥션의 관리자가 CSRF 공격에 당하여 관리자 계정이 탈취된 사례가 있는데 이로 인해 약 1,800만 명의 개인정보가 유출된 사례가 있다.
이러한 방식으로 공격에 당할 경우 상당히 파급력이 커질 수 있는 위험도가 높은 취약점이다.
CSRF 토큰을 넘겨주는 이유
이를 방지하기 위해 Spring Security에서는 CSRF protection이 default로 설정되기 때문에 CSRF 토큰을 넘겨주지 않으면 POST, PUT, DELETE 요청시에는 403으로 forbidden 요청을 반환한다.
때문에 아래처럼 csrf 토큰을 넘겨줘야 문제없이 작동하게 된다.
<input type="hidden" name="${_csrf.parameterName}" value="${_csrf.token}"/>
CSRF protection을 적용하였을 때, html에서 다음과 같은 CSRF 토큰이 포함되어야 요청을 받아들이게 됨으로써, 위조 요청을 방지하게 된다.
CSRF 토큰을 사용하지 않아도 되는 경우
다만 Spring Security documentation에 non-browser clients 만을 위한 서비스라면 csrf를 disable 하여도 좋다고 한다.
이 이유는 REST API를 이용한 서버라면, session기반 인증과는 다르게 stateless(무상태성) 하기 때문에 서버에 인증정보를 보관하지 않는다.
따라서 서버에 인증정보를 저장하지 않기 때문에 굳이 불필요한 csrf 코드들을 작성할 필요가 없다.
좀 더 자세히 설명하면 CSRF는 서버가 클라이언트 상태를 저장하고 있는 것을 이용한 취약점이라고 볼 수 있다.
일반적인 Spirng Security(session 기반 인증)에서는 서버에 세션 정보를 저장할 뿐만 아니라 해당 세션 정보를 식별 하기 위해 사용자 브라우저에 세션 쿠키(세션 정보를 담은 쿠키) 형태로 저장되어 있다.
그렇기에 session 기반 인증일때는 CSRF 취약점이 발생할 여지가 있지만 무상태성을 지키는 JWT나 OAuth2 토큰 로그인 방식(REST API)은 서버에 인증정보를 저장하지 않는다.
그래서 결론적으로 로그인 방식에서 세션 쿠키를 사용하지 않으면 CSRF는 자동으로 방어된다.
REST API와 무상태성에 대해서는 아래 글을 참고하길 바란다.
2023.04.01 - [CS/CS] - API, REST, REST API
https://velog.io/@woohobi/Spring-security-csrf%EB%9E%80
잘못된 내용이 있다면 지적부탁드립니다. 방문해주셔서 감사합니다. |
'CS > CS' 카테고리의 다른 글
[프로젝트 설정] XML과 Java Configuration 설정 방식 (1) | 2024.10.13 |
---|---|
SQL Mapper와 ORM이란? (0) | 2023.05.14 |
멀티태스킹, 멀티프로세싱, 멀티스레딩 (1) | 2023.05.07 |
컴퓨터 구성요소 (0) | 2023.05.07 |
XML, JSON (0) | 2023.04.05 |