이번 문제는 쿠키 새로고침으 통한 SameSite Lax 옵션 우회에 대한 문제다.
이번 문제에서는 특이하게 OAuth 기반 로그인을 지원한다.
OAuth 기반 로그인이란?
웹 서핑을 하다 보면 위 사진처럼 Google과 Kakao 등의 외부 소셜 계정을 기반으로 간편히 회원가입 및 로그인할 수 있는 웹 어플리케이션을 쉽게 찾아볼 수 있다.
이때 사용되는것이 바로 OAuth다.
OAuth란 Open Authorization의 약자로, 애플리케이션이 특정 시스템의 보호된 리소스에 접근하기 위해, 사용자 인증(Authentication)을 통해 사용자의 리소스 접근 권한(Authorization)을 위임받는 것을 의미한다.
확인을 위해 사이트에 접속 후 로그인페이지로 가면
소셜미디어에 로그인 하도록 안내한다는 메시지와 함께
새로운 로그인 형식이 나타난다.
로그인을 마치면 소셜미디어 계정에 성공적으로 로그인했다는 메시지와 함께 로그인에 성공한다.
보통 소셜미디어 계정 연동 흐름은 아래와 같다.
1. 기존 계정과 SNS 계정 연동 요청
2. 요청 SNS 로그인 페이지 출력 (Client ID 값이 포함된 로그인 페이지)
3. ID/PW 를 통해 SNS 계정에 로그인
4. 로그인 성공 시 인증 서버로부터 Authorization code를 발급받음 (Authentication Server -> 사용자)
5. 발급 받은 code 값과 state 값을 Client 서버로 전송 (사용자 -> Client Server)
6. code 값과 state 값 검증 후 Client 서버에 로그인되어있는 계정과 SNS 계정이 연동됨
로그인 후 응답을 살펴보면
https://0a68009203e7fd618244658500d800c9.web-security-academy.net/oauth-callback?code=aWiJQMdimBZH3pQGY2TPwW5-SsKqvBLcA_wd0aI9kJW로 리다이렉팅 되는 걸 볼 수 있는데
여기서 code가 Authorization code에 해당되는 값일 것이고
발행된 session쿠키도 none으로 lax속성을 가질것이다.
하지만 현재 Chrome에서는 2분 이내 SameSite 속성 없이 설정된 쿠키에 대해서는 예외를 가지고 있다. 예외에 해당되는 쿠키는 Lax 정책을 가지지만 POST 등 일부 메서드의 Cross-site Request에서도 쿠키가 포함되어 전달된다. 추후에는 이 예외가 제거될 예정이라고 한다.
이는 무엇을 뜻하면 사용자가 로그인을 하고 2분 안에 이메일을 변경할 때는 별다른 쿠키의 제약이 없다는 소리다.
그럼 로그인 후 2분 안에 사용자가
해당 스크립트를 전송받으면
이메일이 정상적으로 변경되는 걸 확인할 수 있다.