origin
schema와 hostname, port의 조합
•
•
hostname(domain name): 월드와이드웹과 같이 기기끼리의 통신 시 각 기기가 서로를 식별할 수 있도록 할당한 이름. 네트워크 연결장치(컴퓨터, 복사기, 모뎀 등)에 부여되는 이름이고, IP 주소나 물리 주소 대신 사람이 이해하기 쉬운 주소를 주로 사용.
•
port: 웹 서버 상의 리소스에 접근하기 위해 거쳐야하는 게이트. http는 80, https는 443 포트 사용.
same-origin, cross-origin
같은 origin이라면 same-origin, 다른 origin이면 cross-origin. 예를 들어 https://www.example.com:443/foo 는 https://www.example.com:443 와 origin이 같으므로 same-origin 이고, 이때 포트는 생략되어도 상관 없다.
cross-origin의 경우는 아래와 같다. origin이 정확히 맞아떨어져야하며 (포트 생략 가능) 그 외는 모두 cross-origin이다.
•
도메인(Second Level Domain)이 다르거나
•
서브도메인(Third Level Domain)이 다르거나
•
포트가 다르거나
•
스키마가 다른 경우
site
eTLD(effective TLD)와 SLD(Second Level Domain)의 조합. 아래의 예시로 들면 site는 example.com이 된다.
•
DNS 구조 참고
•
한편, .github.io나 .co.kr 처럼 TLD의 하위 도메인을 함께 쓰는 경우 site를 정의하기가 쉽지 않다. 등록가능한 도메인(SLD)만을 알아내는 것이 알고리즘적으로 불가능하므로 public suffix list에 있는 effective TLDs 리스트를 조회해 도메인 이름을 알아내야 한다. public suffix list를 조회하여 https://www.my-project.github.io와 같은 url에서도 full site name을 알아낼 수 있다(my-project.github.io).
여담으로 이와 관련한 코드워즈 문제가 있는데 public suffix list를 커버하지 않으면 풀 수 없는 문제이다. 솔루션을 보면 특정 테스트 케이스만 커버하고 있는데 실무에서 이 경우 많은 예외사항을 처리하지 못할 것이다.
테스트 케이스
same-site와 cross-site
schemeful same-site
SameSite 정책이 SameSite=None 인 경우 몇 가지 보안 위협이 있다. SameSite=None으로 설정할 경우 쿠키를 전송받을 때 사이트 주소를 검증하지 않는다. 외부 사이트에서 쿠키를 전송할 때 제 3자가 XSS(Cross-site scripting) 공격으로 쿠키를 탈취하거나, 스니핑으로 쿠키를 훔쳐보거나 CSRF(Cross-site request forgery) 공격으로 쿠키를 변조하여 요청을 위조할 수 있다.
따라서 같은 site이어도 안전하지 않은 site에서 온 요청(ex. http)은 cross-site로 간주한다. 기존의 site는 schema를 무시했으나 schemful same-site는 보안을 향상시키기 위해 schema까지 cross-site 판단 기준에 포함시킨다.
그 밖에도 SameSite 정책의 default값을 Lax로 설정하는 등 CSRF 공격을 막기 위한 보안 설정이 추가되었다. SameSite=Lax 의 경우 schema가 달라도 같은 site면 쿠키를 전송할 수 있다. 단 http 사이트에서 하위 리소스 클릭 시 https 사이트로 이동하는 경우 SameSite=None;Secure 가 아닌 이상 쿠키를 전송할 수 없다. form submit할 때도 마찬가지. 자세한 정책은 여기 참고.
request 요청이 same-site, cross-site, same-origin 중 무엇인지 구별하는 법
크롬 브라우저는 요청 시 Sec-Fetch-Site http 헤더를 함께 보낸다. Sec-Fetch-Site에는 아래와 같은 값들이 있다. 단, schemeful-same-site는 Sec-Fetch-Site 헤더로는 알 수 없다.
•
cross-site
•
same-site
•
same-origin
•
none