서론
CSRF (Cross-Site Request Forgery)는 웹 애플리케이션 보안 공격의 일종으로, 사용자가 인증된 세션을 가진 상태에서 악의적인 웹사이트가 그 세션을 이용해 사용자의 의도와는 다르게 요청을 보내는 공격입니다.
CSRF에 대한 자세한 내용은 아래의 포스팅에서 확인 가능합니다.
CSRF 공격 방지 방법 중 하나로 CSRF 토큰을 사용하는 방법이 있습니다. 본 글에서는 Spring Security를 사용하여 CSRF 토큰을 활용한 CSRF 방어를 간단하게 살펴보겠습니다.
사용 코드
1. 의존성
간단한 폼과 보안을 위해 Spring Security와 Thymeleaf를 추가했습니다.
2. Controller
SampleController 클래스는 간단한 폼 제출을 처리하는 Spring Boot 컨트롤러입니다.
이 컨트롤러는 GET 요청으로 폼을 표시하고, POST 요청으로 폼 데이터를 처리합니다. @RequestParam을 사용하여 CSRF 토큰과 사용자 이름을 처리합니다.
각 API요청에 따라서 Thymeleaf 템플릿 엔진이 문자열로 반환된 뷰의 이름을 참조하여 실제 HTML 페이지를 렌더링합니다.
❗️CSRF 토큰과 같은 민감한 정보를 콘솔에 출력하는 것은 보안에 좋지 않습니다. CSRF 확인을 위해 @RequestParam을 사용하여 CSRF 토큰을 명시적으로 처리하고, 로그에서 확인을 위해 추가를 했습니다.
3. Spring Security 설정
SampleSecurityConfig 클래스는 Spring Security의 보안 구성을 설정하는 클래스입니다.
HttpSecurity는 Spring Security에서 웹 애플리케이션의 보안 설정을 정의하는 데 사용되는 클래스로, HTTP 요청과 응답에 대한 보안을 구성합니다.
authorizeHttpRequests()
- HTTP 요청에 대한 접근 제어를 설정합니다.
- 이 메서드를 사용하여 URL 패턴에 따라 요청의 접근 권한을 설정할 수 있습니다.
anyRequest().permitAll()
- 설정은 모든 HTTP 요청에 대해 접근을 허용합니다.
- 즉, 인증이나 권한 검사 없이 모든 요청이 허용됩니다.
csrfTokenRepository()
- CSRF 토큰을 쿠키에 저장하고 클라이언트가 이를 요청에 포함시키도록 합니다.
withHttpOnlyFalse()
- CSRF 쿠키가 JavaScript에서 접근 가능하도록 설정합니다. 이 설정은 CSRF 공격을 방어하기 위해 토큰 기반 검증을 수행합니다.
build()
- HttpSecurity 설정을 완료하고 SecurityFilterChain 객체를 생성하여 반환합니다.
- 이 객체는 Spring Security의 보안 필터 체인에 적용됩니다.
4. form.html
5. result.html
CSRF 토큰 동작 확인하기
localhost:8080으로 접속하면 위와 같이 컨트롤러에서 루트 경로로 지정한 from이 나옵니다.
개발자 도구의 Elements 탭을 확인해보면, hidden 필드에 추가하지 않은 _csrf라는 이름의 CSRF 토큰이 자동으로 포함되어 있는 것을 볼 수 있습니다.
이는 Spring Security에서 CSRF 보호 기능을 활성화했기 때문에, 폼 페이지(form.html)가 로딩될 때 Spring Security가 자동으로 CSRF 토큰을 폼에 삽입한 것입니다.
NAME을 입력하고 sumbit 버튼을 클릭하면 정상적으로 result페이지가 반환되었습니다.
그리고 Controller에서 명시적으로 CSRF 토큰을 가져왔기 때문에 콘솔창을 보면 CSRF 토큰과 사용자 이름이 정상적으로 출력되었습니다.
이제 CSRF 토큰을 임의로 변경해보겠습니다. 이는 CSRF 토큰 위조 공격으로, 클라이언트가 서버에 올바른 토큰을 전송하지 않도록 조작하는 시도를 의미합니다.
개발자 도구를 열고, CSRF 토큰 앞에 '@@@@'를 추가한 후 Submit 버튼을 클릭해보겠습니다.
위와 같이 요청을 전송하면 403 에러가 발생합니다. 이는 서버가 전송된 CSRF 토큰이 유효하지 않다고 판단했기 때문입니다. CSRF 토큰이 위조되었거나 변경된 경우, 서버는 요청을 거부하여 CSRF 공격을 방지합니다.
이번 포스팅에서는 Spring Security를 사용하여 CSRF 공격을 방어하는 방법 중 하나인 CSRF 토큰의 동작 원리와 실제 적용 방법을 살펴보았습니다.
CSRF 토큰은 웹 애플리케이션의 보안을 강화하는 중요한 수단 중 하나입니다. 이를 올바르게 구현하면 악의적인 요청으로부터 애플리케이션을 효과적으로 보호할 수 있습니다.
'Framework > Spring Security' 카테고리의 다른 글
[Spring Security] 로그인 처리와 @AuthenticationPrincipal을 활용한 인증 구현 (0) | 2024.08.04 |
---|---|
[Spring Security] Spring Security란❓ (0) | 2024.08.04 |