<aside> spring boot 2.x가 2023년 11월 이후로 지원이 종료되었습니다.

지원이 종료된 소프트웨어는 보안 취약성, 버그, 새로운 기능 등을 제공받을 수 없고 이러한 이유 때문에 장기적인 유지 보수 비용이 증가하게 되므로 결국 개인 프로젝트를 마이그레이션 하기로 결정하였습니다.

https://github.com/JunYoungMoon/EasySignApp

</aside>

CSRF 변경

Untitled

이전에 csrf 토큰을 헤더 값에 있는 값 그 자체를 가져와서 토큰 검증을 했다면 시큐리티 버전이 올라가면서 csrf 토큰 검증 방식이 변경되었습니다.

Untitled

구 버전에서 csrf 토큰을 클라이언트에게 전달할 때 위와 같은 방법으로 전달하게 되면 uuid 형식으로 응답 쿠키와 동일한 값을 전달할 수 있었지만,

Untitled

Untitled

Untitled

Untitled

XOR 핸들러에서 랜덤 한 값과 CSRF 토큰 값을 XOR 연산을 통해 나온 결과물을 결합(랜덤 값 + (CSRF 토큰 값 XOR 랜덤 값)) 하고 base64로 인코딩하여 클라이언트에게 리턴합니다.

Untitled

쿠키에서 전달되는 token 값의 길이는 CSRF 토큰 값 XOR 랜덤 값 즉 xoredCsrf 길이와 같고 클라이언트가 전달하는 actual token 값에서 token 값의 길이를 빼면 랜덤 값의 길이와 같습니다.

인덱스가 0부터 랜덤 값의 길이만큼 복사하면 랜덤 값이 나오게 되고 랜덤 값의 길이부터 토큰의 길이만큼 복사하면 xoredCsrf 값이 나옵니다.

(A XOR B) XOR B = A 공식에 의해 가져온 랜덤 값과 xoredCsrf 값을 다시 xor 연산을 하게 되면 원본 CSRF 토큰 값을 얻을 수 있고 이 값과 token 값이 일치하는지 확인합니다.