본문 바로가기메뉴 바로가기


FE개발자의 성장 스토리 06 : 2021년 Chrome의 새로운 변화 – Schemeful same-site을 대응하자

안녕하세요. FE플랫폼팀 피터입니다 🙂 제가 소속된 FE플랫폼팀에서는 Chrome 업데이트 사항 중 사용자에게 영향을 미치는 기능을 리서치 후 사내 크루들에게 공유하고는 합니다.

이번에는 2021년 1월부터 업데이트되는 Chrome M88에 적용될 Schemeful same-site를 사내 크루들에게 공유하였는데요, Schemeful same-site는 같은 도메인의 HTTP 사이트와 HTTPS 사이트를 cross-site로 취급하도록 정책을 변경한 내용입니다.

관련해서 공식 문서를 통해 리서치한 내용을 공유 드리고자 합니다.


글의 순서

글의 순서는 다음과 같습니다.

  • 용어정의
  • 변경 사항과 목적이 무엇일까
  • 확인이 필요한 부분
  • 어떻게 대응할 수 있을까
  • 요약

용어정의

본문에 작성된 용어의 혼란을 줄이기 위해 우선 용어를 설명해 드리겠습니다.

scheme

URL에서 http, https 부분을 scheme라고 합니다. 예를 들어 https://daum.net에서 https 부분을 scheme라고 합니다.

cross-scheme

같은 도메인인데 다른 scheme을 이동하는 관계를 cross-scheme라고 합니다. 예를 들어 도메인이 daum.net일 때, http://daum.nethttps://daum.net은 다른 scheme를 사용함으로 두 관계를 cross-scheme라고 합니다.

서브리소스

XHR 또는 Fetch로 만들어진 네트워크 요청과 iframe, image 등이 있습니다.

form의 POST 메소드

<form method="POST"> 로 작성된 폼 양식을 submit하는 경우를 의미합니다.

변경 사항과 목적이 무엇일까

이전에는 같은 도메인의 HTTP 사이트와 HTTPS 사이트를 same-site로 취급했습니다. same-site로 취급하기 때문에 Cookie의 SameSite 속성을 Strict 또는 Lax로 설정하면 사이트 간의 Cookie를 보낼 수 있습니다.

하지만 Schemeful same-site가 적용된 후에는 HTTP 사이트와 HTTPS 사이트를 cross-site로 취급합니다. cross-site로 취급하기 때문에 Cookie의 SameSite 속성을 Strict로 설정하면 사이트 간의 Cookie를 보낼 수 없습니다. 때에 따라 Lax로 설정한 쿠키도 보낼 수 없으며 아래에서 자세히 설명하겠습니다.

Schemeful same-site의 주요 목적 중 하나는 HTTP 사이트에서 HTTPS 사이트에 Cookie를 요청할 때 발생할 수 있는 사이트 간 요청 위조(CSRF, Cross-Site Request Forgery) 공격의 취약점을 해결하고 사용자를 보호하기 위한 것입니다. Schemeful same-site의 영향으로 HTTP 사이트의 Cookie를 변조 후 HTTPS 사이트에서 사용할 수 없어서 이러한 사이트 간 요청 위조 공격에 대해서 무효화 할 수 있습니다.

확인이 필요한 부분

Schemeful same-site가 적용되면 세 가지 부분에서 확인이 필요합니다. 첫 번째는 cross-scheme 사이에 이동할 때, 두 번째는 iframe과 image와 같은 서브리소스 / form의 POST 메소드 요청, 세 번째는 WebSocket을 사용할 때입니다. 웹 사이트가 모두 HTTPS로 이루어져 있으면 대응할 사항이 없습니다. 그렇지 않다면 아래 사례를 확인이 필요합니다.

1) 내비게이션

지금까지는 HTTP 사이트와 HTTPS 사이트 사이의 내비게이션에서 Cookie를 보낼 수 있습니다. 하지만 Schemeful same-site가 적용된 후에는 HTTP 사이트와 HTTPS 사이트는 cross-site로 취급하게 됩니다. 이 때문에 Cookie의 SameSite 속성을 Strict로 설정해도 보낼 수 없습니다.

2) 서브리소스 / form의 POST 메소드

지금까지는 HTTP 사이트와 HTTPS 사이트 사이의 서브리소스와 form의 POST 메소드 요청을 통해 Cookie를 보낼 수 있습니다. 하지만 Schemeful same-site가 적용된 후에는 HTTP 사이트와 HTTPS 사이트는 cross-site로 취급하게 됩니다. 이 때문에 Cookie의 SameSite 속성을 Strict 또는 Lax로 설정해도 보낼 수 없습니다.

3) WebSocket

지금까지는 HTTP 사이트와 HTTPS 사이트에서 WebSocket와 WebSocket Secure 연결로 Cookie를 보낼 수 있습니다. 하지만 Schemeful same-site가 적용된 후에는 같은 보안성을 가진 경우에만 same-site로 취급하게 됩니다. 이 때문에 HTTP 사이트는 WebSocket에게만, HTTPS 사이트는 WebSocket Secure에게만 Cookie를 보낼 수 있습니다.

어떻게 대응할 수 있을까

1) 적용 시기

Chrome Platform Status에 따르면 Chrome M88부터 적용될 예정이며, Chromium Dash Schedule 를 보면 알 수 있듯이 Stable 버전은 2021년 1월 19일에 배포될 예정입니다.

2) 테스트 환경

Schemeful same-site를 테스트하기 위해서는 Chrome 86 이상 버전이 필요합니다. Chrome 86부터 chrome://flags에서 Schemeful Same-Site 를 Enabled로 설정하면 Schemeful same-site를 테스트할 수 있습니다.

3) 케이스별 대응 방법

HTTPS로 업그레이드 가능한 케이스

HTTPS로 업그레이드하는 것을 추천합니다. Chrome의 장기적인 계획은 third-party Cookie를 제거하고 개인정보 보호 대안으로 대체하는 것이기 때문에 Cookie의 속성을 변경하는 것은 임시조치입니다.

HTTPS로 업그레이드 불가능한 케이스

SameSite는 Lax로 설정합니다. 1) 내비게이션 경우에만 대응할 수 있고, 2) 서브 리소스 / form의 메소드, 3) WebSocket 경우는 HTTPS로 업그레이드하는 것 외에 해결 방법이 없습니다.

Set-Cookie: <cookie-name>=<cookie-value>; SameSite=Lax

요약

  • 변경사항과 목적이 무엇일까
    • Schemeful same-site가 적용된 후에는 HTTP 사이트와 HTTPS 사이트를 cross-site로 취급함
    • 주요 목적은 사이트 간 요청 위조 공격의 취약점을 해결하고 사용자를 보호하기 위함
  • 확인이 필요한 부분
    • 내비게이션, 서브리소스, form의 POST 메소드, WebSocket에 영향을 미치므로 대응 필요
  • 어떻게 대응할 수 있을까
    • Chrome 86부터 chrome://flags를 통해 테스트 가능
    • HTTPS로 업그레이드 가능 할 때 HTTPS로 업그레이드 추천
    • HTTPS로 업그레이드 불가능하고 1) 내비게이션 경우만 SameSite=Lax로 변경 후 해결

출처

peter.cho
peter.cho 이해하기 쉬운 코드와 아키텍처에 관심이 많아 리팩토링하는 것을 즐기고, 어피치를 좋아합니다 :)
Top Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codegame
codereview
coding
coding test
Collaborative Filtering
communication
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
culture
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
event
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
GHC
github
globalpollution
go
Grace Hopper Celebration
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
KnowledgeGraph
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mobile
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
pair programming
parallel
PBA
performance
planning poker
Platform
polyfill
preview
programming-contest
project
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
session
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
Women Technologists
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업
All Tag
2021
2021-new-krew
Ad Platform
Ad tech
adaptive-hash-index
adt
adtech
agile
agilecoach
ai
algorithm
Algorithm/ML
Algorithm/Ranking
almighty-data-transmitter
Analyzer
android
angular
anycast
App2App
applicative
Architecture
arena
ast
async
aurora
babel
babel7
Backend
BApp
bgp
big-data
binary
ble
blind-recruitment
block
Block Chain
blockchain
bluetooth
brian
business
Cache
cahtbot
canvasapi
Caver
cch
cd
CDR
ceph
certificate
certification
CF
cgroup
chrome
ci
cite
client
clojure
close-wait
cloud
cloudera-manager
clustered-block
cmux
cnn
code-festival
code-review
codegame
codereview
coding
coding test
Collaborative Filtering
communication
competition
Compliance
component
conference
consul
container
contents
contest
contribution
cookie
core-js@3
Corporate Digital Responsibility
couchbase
COVID-19
cpp
culture
Data
data-engineering
DB
deep-learning
Dependency
dependency-graph
desktop
dev
dev-session
dev-track
developer
developer relations
developers
devops
digitalization
digitaltransformation
dns
docker
dr
Electron
employeecard
emscripten
eslint
event
extract-text
Feature List
Featured
Feedback
friendstime
front-end
frontend
functional-programming
funfunday
fzf
garbage-collection
gawibawibo
GC
GHC
github
globalpollution
go
Grace Hopper Celebration
graphdb
graphql
Ground X
growth
ha
hadoop
hate speech
hbase
hbase-manager
hbase-region-inspector
hbase-snashot
hbase-table-stat
hbase-tools
hri
ICPC Sinchon
id
if kakao
ifkakao
infrastructure
innodb
internship
ios
item
Java
javascript
javascript web-assembly
JCMM
JIRA
jsconf
jsconfkorea
json
k8s
kafka
kakao
kakao-Career-Boost-Program
kakao-commerce
kakao-games
kakaoarena
kakaobrain
kakaocommerce
kakaocon
kakaoenterprise
kakaok
kakaokey
kakaokrew
kakaomap
kakaopage
kakaotalk
KAS
KCDC
khaiii
Klaytn
Klip
KnowledgeGraph
kubernetes
l3dsr
l4
License
links
Linux
load-balancing
MAB
Machine Learning
machine-learning
map
marathon
meetup
melon
mesos
message
Messaging
microservice
Microsoft TypeScript
mm
mobil
mobile
mocking
monad
monorepo
ms-office
MSA
mtre
mysql
mysql-realtime-traffic-emulator
nand-flash
network
new
new-krew
nfc
Nickface
nomad
ocp
olive
onboarding
open
open source
opensource
openstack
OpenWork
OSS
page
pair programming
parallel
PBA
performance
planning poker
Platform
polyfill
preview
programming-contest
project
project-structure
pycon
python
quagga
react
reactive-programming
reactor
recap
recommendation
recommendation system
recruitment
redis
redis-keys
redis-scan
related-blind
Renderer
rest
Rome
rubics
ruby
rxjs
s2graph
scala
scalaz
seminar
Serve
server
service
service worker
session
sharding
shopping
Shuffle Partition
socket
spark
spark-streaming
SpringBoot
ssd
Statistics/Analysis
Stomp
storage
storm
style-guide
summer internship
support
System
talk
talkchannel
tcp
tech
Techtalk
test
thread
Thread-Debugging
time-wait
tmux
Topic Modeling
typescript
Untact
update
User Story
vim
vim-github-dashboard
vim-plugin
vue
vue.js
WASM
web
web-cache
web-worker
webapp
webgl
WebSocket
webworkers
weekly
Women Technologists
work
workplatform
개인화 추천
길찾기
라이선스
연관 추천
오픈소스
오픈소스검증
의존성분석
일하는방식
협업

위로