Open JengYoung opened 1 year ago
@JengYoung ์๋ ํ์ธ์! ํด๋น ์ด์๋ฅผ ์ ์ฝ์ด๋ณด์๋๋ฐ ์ดํด๊ฐ ๋์ง ์๋ ๋ถ๋ถ์ด ๋ช ๊ฐ์ง ์์ด์ ์ฌ์ญ๊ณ ์ ํฉ๋๋ค! ๐ค
Oauth ๋ฒํผ
์ ๋๋ฅด๋ฉด Oauth ๋ก๊ทธ์ธ ํ์ด์ง
๋ก ์ด๋"์ CSR์ด ์๋ ์ธ์ฆ ์๋ฒ SSR ๋ฐฉ์์ผ๋ก ์ดํด๊ฐ ๋๋๋ฐ ๋ง์๊น์? ๋ฌผ๋ก ์ผ๋ฐ์ ์ผ๋ก๋ ์ธ์ฆ ์๋ฒ์์ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ์์ด ์ฌ์ฉ๋๊ณ ์์ง๋ง ํผ๊ทธ๋ง ๊ธฐ์ค์ผ๋ก ๋ณด์์ ๋, ์จ์ ๋ ํฐ์์๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ CSR๋ก ํ๋ ๊ฒ์ผ๋ก ์ดํดํ๋๋ฐ ํด๋น ๋ฌธ๊ตฌ์์ ํผ๋์ด ์ค๋ ๊ฒ ๊ฐ์ต๋๋ค.๐ ๋ง์ฝ ์ ํด์ง์ง ์์ ๋ถ๋ถ์ด๋ผ๋ฉด ๋
ผ์๊ฐ ํ์ํด๋ณด์
๋๋ค ๐code_challenge
, nonce
ํ๋ผ๋ฏธํฐ, token request์์ code_verifier
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ ๋ก์ง์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค! SPA(public client)์์ ์์ ํ๊ฒ ์์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด์๋ PKCE์ ์ฌ์ฉ์ด ํ์์ ์ผ๋ก ๋ณด์
๋๋ค ๐ํน์ ํ์ธํ์
จ๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ์ธ์ฆ flow diagram์ ๊ฐ๋จํ๊ฒ ๊ทธ๋ ค๋ณด์์ต๋๋ค. ์จ์ ๋ ํฐ ์ธ์ฆ ์๋ฒ์ ๋ก๊ทธ์ธ ํ, ์์ธ์ค ํ ํฐ์ ๋ฐ๊ธ ๋ฐ๋ ๊ณผ์ ์ slient renew
๊ณผ์ ๋ถํฐ๋ผ๊ณ ์ดํดํด์ฃผ์๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์ง ์ ๋ฆฌ๋์ง ์์ ๋ฏธ์์ฑ ์ํ์ด์ง๋ง ์ฐธ๊ณ ํ์๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค!
ํณ... ์๋ชป ํ์ธํด์ ์๊ฐ์ ๊ฝ์ผ๋ก ๋ ๋ ธ๋ค์ ๐ญ ๋ต๋ณ์ ์์ ํฉ๋๋ค!
@sinbom ์, ์ฐ์ ๋ก์ง์ ๋ํ ์ดํด๊ฐ ์๋ก ๋ค๋ฅธ ๊ฒ ๊ฐ์๋ณด์ฌ์. ์กฐ์ ์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค!
๋จผ์ ์ดํด๋ฅผ ๋๊ธฐ ์ํด ์์ฑํด์ฃผ์ ์ ๊ฐ์ฌ๋๋ ค์! ๐๐ป
ํ์ฌ ํด๋ผ์ด์ธํธ ์ธก์์ ์๊ฐํ๊ณ ์๋ ๋ก๊ทธ์ธ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค!
์์ ํ ๋ถ๋ถ์ ํ์ด๋ผ์ดํธํด์ ํ์ํ์ด์. ํ์ธ ๋ถํ๋๋ ค์! ๋ค์์ ์ง๋ฌธ์ ๋ํ ๋ต๋ณ์ ๋๋ค ๐๐ปโโ๏ธ๐๐ป
- "Oauth ๋ฒํผ์ ๋๋ฅด๋ฉด Oauth ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋"์ CSR์ด ์๋ ์ธ์ฆ ์๋ฒ SSR ๋ฐฉ์์ผ๋ก ์ดํด๊ฐ ๋๋๋ฐ ๋ง์๊น์? ๋ฌผ๋ก ์ผ๋ฐ์ ์ผ๋ก๋ ์ธ์ฆ ์๋ฒ์์ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ ๋ ๋๋งํ๋ ๋ฐฉ์์ด ์ฌ์ฉ๋๊ณ ์์ง๋ง ํผ๊ทธ๋ง ๊ธฐ์ค์ผ๋ก ๋ณด์์ ๋, ์จ์ ๋ ํฐ์์๋ ๋ก๊ทธ์ธ ํ์ด์ง๋ฅผ CSR๋ก ํ๋ ๊ฒ์ผ๋ก ์ดํดํ๋๋ฐ ํด๋น ๋ฌธ๊ตฌ์์ ํผ๋์ด ์ค๋ ๊ฒ ๊ฐ์ต๋๋ค.๐ ๋ง์ฝ ์ ํด์ง์ง ์์ ๋ถ๋ถ์ด๋ผ๋ฉด ๋ ผ์๊ฐ ํ์ํด๋ณด์ ๋๋ค ๐
- authorization request์์ code_challenge, nonce ํ๋ผ๋ฏธํฐ, token request์์ code_verifier ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๋ ๋ก์ง์ด ์ถ๊ฐ์ ์ผ๋ก ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค! SPA(public client)์์ ์์ ํ๊ฒ ์์ธ์ค ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ธฐ ์ํด์๋ PKCE์ ์ฌ์ฉ์ด ํ์์ ์ผ๋ก ๋ณด์ ๋๋ค ๐
ํ, ์ ๊ฐ ํผ์ ํ๋ค๋ ์๊ฐ(...)์ ๋ชจ๋ ๋ด์ฉ์ ์๋ตํ๊ณ ์ค๋ช ํ์ด์. ๋ง์ต๋๋ค! <Kakao, Naver>์์ ์ ๊ณตํ๋ SDK๋ SSR์ ํตํด ์์ ๋ค์ URI๋ก ์ด๋์ํค๋๋ก ํด์.
๋ค๋ง CSR ๋ถ๋ถ์ด ์กด์ฌํ๋ค๊ณ ํ์ ๋ ์ค๋ช
์ ๋๋ ธ๊ณ , ์ด๊ฒ์ด ์ปค๋ฎค๋์ผ์ด์
์์ ๋ฌธ์ ์ ์ผ๋ก ๋ฐ๊ฒฌ๋ ๊ฒ ๊ฐ์์!
์ด์ ๋ํ ๋ต๋ณ์ ๋๋ฆฌ์๋ฉด, redirect_uri
์์ ๋ค์ ๋ <ํด๋ผ์ด์ธํธ>์์ <์จ์ ๋ ํฐ ์ธ์ฆ ์๋ฒ>๋ฅผ ๊ฑฐ์น๊ฒ ๋ ๊ฒ์ด๊ณ , ์ฌ๊ธฐ์ ๋ฆฌ๋ค์ด๋ ํธ ํ๋ ๋ถ๋ถ์ CSR๋ก ํ๋ค๋ ์ด์ผ๊ธฐ์์ด์!
์ ๋ฆฌ:
- SSR๋ก ์นด์นด์ค/๋ค์ด๋ฒ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋, SSR๋ก ๋ค์ redirect_uri๋ก ์ด๋ํด์.
- CSR๋ก ์ดํ ์์ฒญ์ ๋ฐ๋ผ ์ธ๋ฑ์ค ํ์ด์ง๋ก ์ด๋ or ์คํจ ์ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํด์.
PKCE
์ ๋ํ ๋ด์ฉ์ ์ง๋ ํ์ ์ ํฉ์๋ฅผ ํ๊ธฐ ๋๋ฌธ์, ์๊ฒ ์ต๋๋ค!
code_challenge
๋ฅผ ์ ๋ฌํ ๊ฒ์. ๐code_verifier
์ ์ ๋ฌํ ๊ฒ์. ๐๋ค๋ง ์ฌ๊ธฐ์ ํ์๋๋ ๊ถ๊ธํ ์ ์ด ์๊ฒผ์ด์!
์ ๋ฒ ํ์์์ nonce
์ ๊ฒฝ์ฐ, Kakao
์์๋ ์ง์ํ์ง๋ง Naver
์์๋ ์์ฒญ ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์๊ตฌํ์ง ์๋ ๊ฒ์ผ๋ก ๋ง์๋๋ ธ๋ ๊ฒ ๊ฐ์์.
Naver Login API ์์ฒญ ๋ณ์๋ช
๋ช
์ธ
ํน์ nonce
๋ฅผ ์์ฒด์ ์ผ๋ก ์ฌ์ฉํ ๊ฒ์ธ์ง ๊ถ๊ธํด์! ํ๋ค๋ฉด, ํ๋ก ํธ์๋ ์ธก์์๋ ๋ฌด์์๋ก ์์ฑํ ๊น์?
์ผ๋จ ํผ๊ทธ๋ง์ ๊ทธ๋ฆผ์ ํ์ดํ๋ฅผ ๋ณผ ๋, code_verifier
์ ์๋ฒ์์ ๋ณด๋ด์ฃผ๋ ๊ฒ ๊ฐ์์. ๋ง์๊น์?
ํ์ง๋ง IBM - PKCE๋ฅผ ์์๋ก ์ดํด๋ณผ ๋์๋ ๋ณดํต ํด๋ผ์ด์ธํธ์์ code_verifier
๋ฅผ ์์ฑ ํ, code_challenge
๋ฅผ ์์ฑํ๋ ๊ฒ ๊ฐ๋๋ผ๊ตฌ์. ๋์ , ์ด๋ค ๋ฐฉ์์ผ๋ก ์ํธํํ ๊ฒ์ธ์ง๋ฅผ ์๋ ค์ฃผ๋ ๋ฐฉ์์ผ๋กcode_challenge_method
์ด๋ผ๋ ์ฌ์ฉํ๋ ๊ฒ ๊ฐ์์. ์ด๋ Oauth Playground์์๋ ์ค๋ช
๋์ด ์๋ ๋ณ์์์!
์๋ฌด๋๋ ์ด๊ฒ ๊ฐ์ฅ ์ ํํ๋ ๋ฐฉ์์ธ ๋ฏํ๋ฐ, ์ด๋ฌํ ๋ก์ง์ผ๋ก ๋ค์ ๋ณ๊ฒฝํด์ผ ํ ํ์์ฑ์ ์์๊น์?
์ ๊ฐ ์์ง Oauth๊ฐ ์ํด์ด์ ๊ทธ๋ฐ์ง, Oauth Playground - PKCE๋ฒ์ ์ผ๋ก ๋ค์ ํด๋ดค๋๋ฐ์.
์ฌ๊ธฐ์๋ redirect_uri
ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๊ณ ์๋ค์!
ํ๋ก ํธ์๋ ์
์ฅ์์๋ ๋ฆฌ๋ค์ด๋ ํธํ ๋์์ ์ง์ ํ์ด์ง๋ก history
๋ฅผ ์ถ์ ํ๋ฉด ํด๊ฒฐ ๊ฐ๋ฅํ ์ ์์ผ๋, ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐ์ค ๊ฒ์ธ์ง ๊ถ๊ธํฉ๋๋ค! (๋ฌผ๋ก ํด์ฃผ์ ๋ค๋ฉด ํ๋ก ํธ์๋ ์ธก์์ ๋์ ๊ฑด ์์๋๋ค! ๐๐ปโโ๏ธ)
์๊ตฌ... ์ ๋ถ์ฐฐ๋ก ์ธํด ์ด์ ๋ต๋ณ์ ๋ณด์ จ๋ค๋ฉด ๋ต๋ณ์ ํผ๋์ด ์์ ์ ์๋ ์ ์ํด ๋ถํ๋๋ฆฝ๋๋ค( ) ๋ถ์กฑํ ํ์์ด์ง๋ง ์ ๋ถํ๋๋ ค์! ์ฌ์ ๋ก์ฐ์ค ๋ ํธํ๊ฒ ๋ต๋ณํด์ฃผ์ธ์~ ๐๐ปโโ๏ธ
๋ต๋ณ์ด ์ ์ ๋ฆฌ๋์ด์ ์ฝ๊ธฐ ํธํ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค! ๐ ์๋ฌด๋๋ ์ฒ์์ ์ ๊ฐ ์๋ฌธ์ ๊ฐ์ง๊ณ ์ง๋ฌธํ๋ ๋ถ๋ถ๋ค์ด ์๋ก๊ฐ ์ดํดํ ๋ถ๋ถ์ด ๋ฌ๋ผ์ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ํ ๋ค์ด์ด๊ทธ๋จ์ ์์ฑํ ์๋๊ฐ ๋ณด๋ ์ฌ๋์๊ฒ๋ ์ ์ ๋ฌ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค.(์ฃ์ก,, ๐) ์๋ก๊ฐ์ ์ ํํ ์ดํด๋ฅผ ์ํด ๊ฐ๋ ์ ๋ํ ์ ๋ฆฌ๋ฅผ ๋ค์ ํด๋ณด๊ณ ์ง๋ฌธํ์ ๋ด์ฉ์ ๋ํ ๋ต๋ณ์ ํด๋ณด๊ฒ ์ต๋๋ค!
์จ์ ๋ ํฐ ๋ก๊ทธ์ธ or 3rd party ๋ก๊ทธ์ธ์ ๊ฐ๊ฐ ๋ค๋ฅธ diagram์ ํํํ์ต๋๋ค.
state
, nonce
, code_challenge
, code_verifier
๋ฅผ ์์ฑํฉ๋๋ค.
- state๋ CSRF๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํ ํ๋ผ๋ฏธํฐ์ด๋ฉฐ ํด๋ผ์ด์ธํธ์์ ์์ฑํ ๋๋ค ๋ฌธ์์ด์ ๋๋ค.
- nonce๋ Replay Attack์ ๋ฐฉ์งํ๊ธฐ ์ํ ํ๋ผ๋ฏธํฐ์ด๋ฉฐ ํด๋ผ์ด์ธํธ์์ ์์ฑํ ๋๋ค ๋ฌธ์์ด์ ๋๋ค.
- code_verifier: code_verifier๋ authorization code injection์ ๋ฐฉ์งํ๊ธฐ ์ํ ํ๋ผ๋ฏธํฐ์ด๋ฉฐ ํด๋ผ์ด์ธํธ์์ ์์ฑํ ํน์ ๋ฌธ์๋ค๋ก ์ด๋ฃจ์ด์ง 48~120์์ ๋๋ค ๋ฌธ์์ด์ ๋๋ค.
- code_challenge: Base64(SHA256(code_verifier)
state
, nonce
, code_challenge
๋ฅผ ์ ๋ฌํฉ๋๋ค.code
, state
๊ฐ๊ณผ ํจ๊ป ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ๋ฐ์ ํ์ด์ง์์ state
๊ฐ์ด ๋์ผํ์ง ๊ฒ์ฆํฉ๋๋ค.code
, code_verifier
๋ฅผ ์ ๋ฌํฉ๋๋ค.access_token
, id_token
์ ์๋ต ๋ฐ์ผ๋ฉฐ, id_token
์ payload(claim)์ ํฌํจ๋ nonce
๋ฅผ ๊ฒ์ฆํฉ๋๋ค.์จ์ ๋ ํฐ ๋ก๊ทธ์ธ ํ, ํ ํฐ ๋ฐ๊ธ ๊ณผ์
์ 2๋ฒ๋ถํฐ 6๋ฒ ๊น์ง์ ๊ณผ์ ์ด ์งํ๋ฉ๋๋ค.3rd party๋ก ๋ก๊ทธ์ธ ํ, ํ ํฐ ๋ฐ๊ธ ๊ณผ์
์ ํด๋นํ๋ฉฐ ๊ฐ 3rd party๋ค์ ๊ตฌํ์ด ๋ค๋ฅด๋ฏ๋ก ์ฌ์ฉํ ์ ์๋ ํ๋ผ๋ฏธํฐ๋ค์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ํ๋ผ๋ฏธํฐ๋ค์ ํ๊ธฐํ์ง ์์์ต๋๋ค. ๋ํ ํ์ฌ ์ฃผ๊ณ ๋ฐ๋ ํ๋ผ๋ฏธํฐ์ ๋ํ ์์ธํ ๋ด์ฉ๋ค์ ๊ธฐ์
๋์ง ์์ ๋ฏธ์์ฑ ์ํ์
๋๋ค ๐state
, nonce
๋ code
๊ฐ์ผ๋ก token์ ๊ตํํ๋ callback์ ์ํํ๋ ๊ณณ์์ ์์ฑํ๊ณ ๊ฒ์ฆํฉ๋๋ค. 3rd party ๋ก๊ทธ์ธ ํ์ callback์ ํ์๊ฐ์
๋ฐ ์ ์ ์ธ์
์์ฑ ๋ฑ์ ์ฒ๋ฆฌํด์ผํ๋ฏ๋ก callback์ ์ธ์ฆ ์๋ฒ์์ ์ํํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก 3rd party authorization request URI๋ ์๋ฒ๋ก ๋ถํฐ ๋ฐ์์ ์ฌ์ฉํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.nonce
๋ฅผ ์ฌ์ฉํ๋ค๊ณ ํ๊ธฐํ ๊ณณ์ ๊ณณ์ slient renew
๋ถ๋ถ์ ํด๋นํ๋ 3rd party๊ฐ ์๋ ์จ์ ๋ ํฐ์ ์ธ์ฆ ์๋ฒ์์ authorization request & token request ๊ณผ์ ์
๋๋ค. ๋ค๋ง ์นด์นด์ค ๊ฐ์ ๊ฒฝ์ฐ๋ OIDC๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค. 3rd party๋ ์ง์ํ๋ ํ๋ผ๋ฏธํฐ๊ฐ ๊ฐ๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๊ตฌํ ๋ด์ฉ๋ ๋ค๋ฅผ ๊ฒ ๊ฐ์ต๋๋ค.
code_verifier
, code_challenge
๋ ํด๋ผ์ด์ธํธ์์ ์์ฑํ๋ ๊ฒ์ด ๋ง์ต๋๋ค. ๋ค์ด์ด๊ทธ๋จ์์๋ ํ์ดํ์์ ์ ๋ฌ๋๋ ๊ฐ์ผ๋ก ํํํ ๊ฒ์ ์๋๊ณ ํด๋น ์์ฒญ ๋๋ ์๋ต์ ๋ฐ์ ์ชฝ์์ ์ํํ๋ ์ผ์ ๋ํ ๋ด์ฉ์ ์ถ์ํํ์ฌ ๋ํ๋ธ ๊ฒ์
๋๋ค. ์๋ฅผ๋ค์ด Request tokenํ์ ์ธ์ฆ ์๋ฒ์์ code_challenge
๋ฅผ ๊ฒ์ฆํ๊ณ token์ Responseํ๋ค๋ ์๋ฏธ์
๋๋ค. code_challenge_method
๋ํ ์ ๋ฌ์ด ํ์ํฉ๋๋ค. ๋ค์ด์ด๊ทธ๋จ์์๋ ์ฃผ๊ณ ๋ฐ๋ ๋ชจ๋ ํ๋ผ๋ฏธํฐ๋ค์ ๋ํด์ ์์ง ๋ช
์ํ์ง๋ ์์์ต๋๋ค. ๊ฒฐ๋ก ์ ์๋ก๊ฐ ์๊ณ ์๋๋๋ก ์งํํ๋ฉด ๋๊ณ ๋ณ๊ฒฝํ ๋ด์ฉ์ ์์ต๋๋ค!
Oauth ์คํ์์ redirect_uri
๊ฐ optionalํ ๊ฐ์ด๋ฏ๋ก ์ฌ์ฉํ์ง ์์ ์ ์์ต๋๋ค. ์จ์ ๋ ํฐ์ ์ธ์ฆ ์๋ฒ์์๋ SPA์์ slientํ๊ฒ authorization request & token request๊ฐ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ์ง ์์๋ ๋์ง๋ง ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํฉ๋๋ค. 3rd party ์ธ์ฆ์ ๊ฒฝ์ฐ์๋ callback์ ๋ฐ์์ผํ ๋์์ ์ ์ ์๊ธฐ ๋๋ฌธ์ ํ์๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
์นด์นด์ค redirect_uri ํ์
๋ค์ด๋ฒ redireect_uri ํ์
์ฐ์ ๊ธ๊ณผ ๋ค์ด์ด๊ทธ๋จ์ด ๋ช ํํ์ง ์์์ ์คํด์ ์์ง๊ฐ ์์๋ค์.. ๐ญ ๋ค์ด์ด๊ทธ๋จ์ ํ์๋ค(@JengYoung, @Msukoo)๊ณผ ํจ๊ป ๋ณด์ํด๋๊ฐ๋ฉด ์ข์ ๊ฒ ๊ฐ๊ณ ์ธ์ฆ ๊ด๋ จ API ์คํ๋ ๋ฌธ์๋ก ์ ๋ฆฌํ ์์ ์ ๋๋ค. ๊ธด ๊ธ ์ฝ์ผ์๋๋ผ ์๊ณ ๋ง์ผ์ จ์ต๋๋ค. ๊ถ๊ธํ ์ ์์ผ์๋ฉด ๋ด์ฉ ๋จ๊ฒจ์ฃผ์ธ์ ๐โโ๏ธ
์ค์๋ก ๋ซ๊ธฐ๋ฅผ ๋๋ฌ์ ๋ ๋ค์ ์ฐ๋ค์... ๐๐ฅฒ๐ญ
@sinbom ์์ธํ ์ค๋ช ๊ฐ์ฌ๋๋ ค์! ์ ๋ ๋๋ถ์ ์ดํด๊ฐ ๋ง์ด ๋์ด์ ๐๐ป ์ถ๊ฐ์ ์ผ๋ก state, nonce ํ๋ผ๋ฏธํฐ์ ๋ํด ๋ ผ์ํ ๋ถ๋ถ์ด ์กด์ฌํด์ ๋ค์๊ณผ ๊ฐ์ด ๋จ๊น๋๋ค!
์ผ๋จ ์ด๋ฌํ ์ค๋ช ์ด ๋์จ ๋ฐฐ๊ฒฝ์ ํด๋น ๋ต๋ณ์ ๋ํด ์์ง ์ ํํ ํ๋จ์ด ๋์ง ์์์์์!
state, nonce๋ code ๊ฐ์ผ๋ก token์ ๊ตํํ๋ callback์ ์ํํ๋ ๊ณณ์์ ์์ฑํ๊ณ ๊ฒ์ฆํ๋ค.
state
, nonce
๋ ์ด์ ์ 3rd party
์ ํด๋ผ์ด์ธํธ์ ์ํธ์์ฉ์ ์์ด์๋ ํ์ํ ๊ฒ ๊ฐ์์! (nonce
๋ ์นด์นด์ค์์๋ง)
SDK
์์๋ ๊ฒฐ๊ตญ ํด๋ผ์ด์ธํธ-Oauth ์ ๊ณต์์ ํต์ ์ด ์ผ์ด๋๋๋ฐ์. ์ด๋ฌํ ๋ก์ง์์์ ๋ฌธ์ ์ ์ ๋ฐฉ์งํ๊ณ ์ SDK
์ state
, nonce
๋ฅผ ๋ฏธ๋ฆฌ ๋ฃ์ด์ค ์ ์์ด์. (์ฌ์ง์ด Naver์ ๊ฒฝ์ฐ์๋ state๊ฐ ์ค์ ๋ ๊ฒ ์๋๋ผ๋ ๊ฐ์ ๋ก ๋ฃ์ด์ฃผ์ด์.) ํ๋ก ํธ์๋ ์ธก์ ์ด๋ฅผ ํ์ฉํ๊ณ ์ ํฉ๋๋ค!
๊ทธ๋ ๊ธฐ์ state
๋ ๋จ์ํ ํ ํฐ ๊ตํ์ ์์ด์๋ง ์ฌ์ฉ๋์ง ์๋๋ค๋ ๊ฒ์ผ๋ก ๋ฌธ์ฅ์ ์์ ํด์ผ ํ ํ์๊ฐ ์์ ๊ฒ ๊ฐ์ต๋๋ค!
(nonce
์ญ์ ์นด์นด์ค ์ญ์ OIDC๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ด๋ฅผ 3rd party ์ธ์ฆ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ API ํต์ ์์๋ ์ฌ์ฉํ๊ฒ ์ฃ !)
๊ฒฐ๊ตญ ํ๋ก ํธ์๋ ์ธก์์๋ SDK ๊ธฐ๋ฐ ๋ก์ง์ ๋ ์์ ์ ์ผ๋ก ์ด์ฉํ๊ธฐ ์ํด state
, nonce
๊ฐ์ ๋ฒํผ ํด๋ฆญ ์ด๋ฒคํธ ์ ํ์ด์ง ๋ฆฌ๋ค์ด๋ ํธ ์ด์ ์ ์์ฑํ๋๋ฐ์!
๊ถ๊ธํ ์ ์ด ์์ต๋๋ค. ํด๋น ๊ฐ๋ค์ ์ฐ๋ฆฌ ์ธ์ฆ์๋ฒ์์ ์ฌ์ฌ์ฉํด๋ ๋ฌธ์ ๊ฐ ์์๊น์?
์ค๋ช ์ด ์ ๋ง ์์ธํ์ฌ ๋๋จธ์ง๋ ์ ์ดํด๊ฐ ๋์์ต๋๋ค. ๐ ๊ณ ๋ง์์!
์๋๋ ์๋ฐ์คํฌ๋ฆฝํธ SDK ๋ช ์ธ์ ๋ํด ๊ถ๊ธํ์ค ์๋ ์์ ๊ฒ ๊ฐ์ ์ถ๊ฐํฉ๋๋ค!
์๋ฌด๋๋ state์ nonce์ ๋ฒ์๊ฐ ์ฐ๋ฆฌ ์๋ฒ์์์ ํ ํฐ ๊ตํ์๋ง ๋ฐ์ํ๋ค๋ ๊ฒ์ผ๋ก ๊ท๊ฒฐ๋์ด ์์นซ ์จ๋ํํฐ ์ธ์ฆ์ ์์ด์์ state, nonce์ ์คํด๊ฐ ์์๊น๋ด ์ฌ์ ์ ์ฌํ์ธ ์์ฒญ ๋๋ฆฌ๋ ์ ์ํด ๋ถํ๋๋ ค์! ๐๐ปโโ๏ธ
@JengYoung ํ์ธ๊ฐ์ฌํฉ๋๋ค! ์ฐ์ ๊ธ์ด ๋ค ๋ ๋ผ๊ฐ์ ๋ค์ ์์ฑํ์ จ๋ค๋,, ๐ ์ ๋ ๊ทธ๋ฐ ์ ์ด ์์ด์ markdown editor์์ ์์ฑํด์ ๋ถ์ฌ๋ฃ๊ณ ์์ต๋๋ค.
Oauth ์ ๊ณต์์์ ์ง์ํ๋ Javascript SDK๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฑ์๋๊ฐ ์๋ SPA์์์ ์ฌ์ฉ์ ๋ชฉ์ ์ผ๋ก ์ ๊ณต๋์๋ ๊ฒ์ผ๋ก ์๊ณ ์์ต๋๋ค. state
๋ CSRF๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ํ๋ผ๋ฏธํฐ์ธ๋ฐ ํด๋น ํ๋ผ๋ฏธํฐ๊ฐ ์ค์ง์ ์ผ๋ก CSRF๋ฅผ ๋ฐฉ์งํ๋ ํจ๊ณผ๋ฅผ ๊ฐ์ง๊ธฐ ์ํด์๋ callback์ ์ฒ๋ฆฌํ๋ ๊ณณ์์ ๊ฒ์ฆ์ ์ํํด์ผํฉ๋๋ค. ์๋ฅผ๋ค์ด CSRF ์ํฉ์ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ์ฌ์ฉ์๋ ๋ก๊ทธ์ธ์ด ๋์ด ์๋ ์ํฉ์์ ๊ณต๊ฒฉ์์ ์น ์ฌ์ดํธ์์ authorization request๋ฅผ ํ๊ฒ๋๋ฉด code
๊ฐ ํฌํจ๋ redirect_uri
๋ก ๋ฆฌ๋ค์ด๋ ํธํฉ๋๋ค. ์ด ๋ ์ค์ ๋ก ํ ํฐ์ ๋ฐ๊ธ ๋ฐ๋ callback ์ฒ๋ฆฌ๋ ์๋ฒ์์ ์ํํ๊ธฐ ๋๋ฌธ์ state
๊ฒ์ฆ์ด ์๋ฒ์์ ์ด๋ฃจ์ด์ง์ง ์์ผ๋ฉด state
ํ๋ผ๋ฏธํฐ๋ ์ค์ง์ ์ผ๋ก ์ฌ์ฉํ๋ ์๋ฏธ๋ ์์ต๋๋ค. ๋ํ ๊ณต๊ฒฉ์๊ฐ code
๋ฅผ ํ์ทจํ๊ฒ ๋ ๊ฒฝ์ฐ์๋ callback์ ํด๋นํ๋ redirect_uri
๋ก code
๊ฐ์ ์ ๋ฌํ๋ฉด ์ ํจํ์ง ์์ ๊ณต๊ฒฉ์์ ์์ฒญ์ธ์ง ์ ํจํ Oauth ์ ๊ณต์์ callback ์์ฒญ์ธ์ง ์ ์ ์์ง๋ง(PKCE ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ๋ฅ) state
๋ฅผ ํตํด ์ ์์ ์ธ ์์ฒญ์ธ์ง ๊ฒ์ฆํ ์ ์์ต๋๋ค.
๊ฒฐ๊ตญ์๋ ์๋ฒ์์ 3rd party authorize request์์ ์์ฑ๋ state
๋ฅผ ์๊ณ ์์ด์ผ ํ๊ณ ์๊ณ ์์ด์ผ ๊ฒ์ฆ์ด ๊ฐ๋ฅํ๋ค๋ ์๋ฏธ์
๋๋ค.
state, nonce๋ code ๊ฐ์ผ๋ก token์ ๊ตํํ๋ callback์ ์ํํ๋ ๊ณณ์์ ์์ฑํ๊ณ ๊ฒ์ฆํ๋ค.
์์ ๋ด์ฉ์ state
๋ฅผ ์์ฑํ๋ ์ฃผ์ฒด๊ฐ ์๋ฒ๊ฐ ๋ ๊ฒ์ด๊ณ , ์๋ฒ์์ ์์ฑํ state
๋๋ aurhotization request URI๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํ๊ณ ํด๋ผ์ด์ธํธ์์ ์ด๋ฅผ 3rd party ๋ก๊ทธ์ธ์ ์ฌ์ฉํด์ผํ ๊ฒ ๊ฐ๋ค๋ ์๋ฏธ์์ต๋๋ค. ๋ง์ฝ SDK๋ฅผ ๋ฐ๋์ ์ฌ์ฉํด์ผํ๋ ์ํฉ์ด๋ผ๋ฉด state
๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌํด์ผ ๋ ๊ฒ ๊ฐ๋ค์..
state
, nonce
๋ ๋งค ์๋ก์ด authorization request ๋ง๋ค ์์ฑํด์ผํ๋ ๊ฐ์
๋๋ค. ์ฌ์ฌ์ฉ์ํ๊ฒ ๋๋ฉด ๊ฐ ํ๋ผ๋ฏธํฐ๋ค์ด ๊ฐ์ง๋ ์๋ฏธ๊ฐ ์ฌ๋ผ์ง๊ฒ๋ฉ๋๋ค.
@sinbom @Msukoo
12์ 31์ผ 1์ 20๋ถ ~ 2์ 50๋ถ๊น์ง ์ด์ผ๊ธฐ๋ฅผ ๋๋๋ฉฐ ๋ค์ ์ ๋ฆฌํด๋ณด์์๋๋ค! PR์ ์ฌ๋ฆฌ๊ธฐ๋ก ํ ๋ฌธ์ ์ ๋ฐ์ดํธ๋, ์ด ์ง๋ฌธ์ ํด๊ฒฐํ ์ดํ ์์ฑํ์ฌ ์์ฒญํ๊ฒ ์ต๋๋ค.
SDK
๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์์ ๋ฐ์ํ ํน์ํ ์ผ์ด์ค์
๋๋ค!
(์ฌ์ค ์ ์จ๋ ๋ผ์, ๋ฐฑ์๋ ๋ถ๋ค๊ป์ ๊ฒฐ์ ํด์ฃผ์
๋ ๋ฌด๋ฐฉํ ๊ฒ ๊ฐ์์ ๐)silent refresh
๋ก ํ ๊ฒ์
๋๋ค.silent refresh
๋ PKCE
๋ฐฉ์์ ์ฑ์ฉํฉ๋๋ค. ์ด๋, ๊ฒ์ฆ์ ์์ด ๋ณด์ด์ง ์๋ ์์ญ์์ ๋ฆฌ๋ค์ด๋ ํธ ๋ก์ง์ด ์ํ๋ฉ๋๋ค. ๋ฐ๋ผ์ Hidden Iframe
์ ํตํด code_challenge์ code_verifier ๊ฒ์ฆ์ ๋ณด์ด์ง ์๋ ์์ญ์์ ๋ฆฌ๋ค์ด๋ ํธํ๋ฉฐ ํ ํฐ ๊ฒ์ฆ/๋ฆฌํ๋ ์๋ฅผ ์ํํฉ๋๋ค.๋ค๋ง ์๊น ์ด์ผ๊ธฐ์์๋ ๋ง์๋๋ ธ๋ฏ ๋ช ์๊ฐ์ ์๊ฐํด๋ ํด๊ฒฐ๋์ง ์๋ ์๋ฌธ์ด ์์ด ์ฌ์ฐจ ์ง๋ฌธ ๋๋ฆฝ๋๋ค...!
์ง๋ฌธ: PKCE์ ์ฅ์ ์ ์ด์ผ๊ธฐํ๋ ๊ณผ์ ์์
cookie
์ด์ผ๊ธฐ๊ฐ ๋์๋ ๊ฒ ๊ฐ์๋ฐ, ํน์ ์ด์ ๊ด๋ จ๋ ๋ถ๊ฐ ์ค๋ช ์ด ๊ฐ๋ฅํ ๊น์? ์ด์ : ๋น ๋ฅธ ์๊ฐ ๋ด์ ์ดํด๋ฅผ ํ๋ ๊ณผ์ ์์ ๋ง์ํ์cookie
๊ฐ ์ด๋ค ์ฟ ํค์ธ์ง ์์ง ์ธ์ง๊ฐ ๋์ง ์์ ์ํ์ ๋๋ค...!
PKCE์ ๊ด๋ จํ ์ฟ ํค ์์ฒญ/์๋ต์ ๋ํด ๋ช ์๊ฐ์ ์ฐพ์๋ณด์์ง๋ง ์๊ฒ ๋ ๊ฒ์ด๋ผ๊ณ ๋
httponly
cookie๋ฅผ ํตํด js์์์ cookie Document.cookie API ์ ๊ทผ ์ฐจ๋จsamesite
์์ฑ์ ์ ์ดํ์ฌ iframe
์์์ ์ฟ ํค ์ ์ก ์ฐํ๋ฐ์ ์ธ์งํ์ง ๋ชปํ ์ํฉ์ ๋๋ค. ํค์๋์ ๋ํ ๋ช ํํ ์ดํด๋ฅผ ์ํด ๋์ ๋ถํ๋๋ ค์ ๐๐ป ์ฐ๋ง์ธ๋ฐ, ์ข์ ํ๋ฃจ ๋ณด๋ด์๊ตฌ, ํธํ์ค ๋ ๋ต๋ณํด์ฃผ์๊ธธ ๋ฐ๋๋๋ค ๐ ์์ธํ๊ณ ์น์ ํ ์ค๋ช ๊ณ ๋ง์์!
@JengYoung ์ค๋ ํ๋ฃจ ์ด์ฌํ ๋ ผ์ํ ๋ณด๋์ด ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ ํํ๊ฒ ์ ์ดํด๊ฐ ๋์ ๊ฒ ๊ฐ์ต๋๋ค ๐
๋ณธ๋ ๋ฐฑ์๋์์ ์ฝ๋ฐฑ์ ์ํํด๋ ๋์ง๋ง ์ฐ๋ฆฌ ์ธ์ฆ์ ์ฐจ๋ SDK๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์์ ๋ฐ์ํ ํน์ํ ์ผ์ด์ค์ ๋๋ค! (์ฌ์ค ์ ์จ๋ ๋ผ์, ๋ฐฑ์๋ ๋ถ๋ค๊ป์ ๊ฒฐ์ ํด์ฃผ์ ๋ ๋ฌด๋ฐฉํ ๊ฒ ๊ฐ์์ ๐)
ํ์ฌ ์ํฉ์์๋ SDK
๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ ํฉํ๋ค๋ ์๊ฒฌ์
๋๋ค. @JengYoung๋ ๊ป์ ํน์ SDK
๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์๊ธธ ์ ์๋ ๋ฌธ์ ์ ๋ค์ด ์๋์ง ํ์ธํด๋ด์ฃผ์๊ณ ๊ด์ฐฎ๋ค๋ฉด ์ฌ์ฉํ์ง ์๋ ๊ฒ์ผ๋ก ์งํํ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค ๐
์ง๋ฌธ: PKCE์ ์ฅ์ ์ ์ด์ผ๊ธฐํ๋ ๊ณผ์ ์์ cookie ์ด์ผ๊ธฐ๊ฐ ๋์๋ ๊ฒ ๊ฐ์๋ฐ, ํน์ ์ด์ ๊ด๋ จ๋ ๋ถ๊ฐ ์ค๋ช ์ด ๊ฐ๋ฅํ ๊น์? ์ด์ : ๋น ๋ฅธ ์๊ฐ ๋ด์ ์ดํด๋ฅผ ํ๋ ๊ณผ์ ์์ ๋ง์ํ์ cookie๊ฐ ์ด๋ค ์ฟ ํค์ธ์ง ์์ง ์ธ์ง๊ฐ ๋์ง ์์ ์ํ์ ๋๋ค...!
์๋ง PKCE
๊ฐ ์๋ iframe
์์ ๋์จ ์ด์ผ๊ธฐ์ธ ๊ฒ ๊ฐ์ต๋๋ค. hidden iframe
์ ์ฌ์ฉํจ์ผ๋ก์จ authorize request ํ์ด์ง์์์ csrf
ํ ํฐ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๊ณ ์ธ์
์ฟ ํค์ domain attribute
์ value๋ฅผ ํด๋ผ์ด์ธํธ์ ๋๋ฉ์ธ(subdomain)๊น์ง ํฌํจ์ํค์ง ์๊ณ ์ธ์ฆ ์๋ฒ์ ๋๋ฉ์ธ์๋ง ํ์ ํ ์ ์๋ค๋ ๋ง์์ ๋๋ ธ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ค์ ํ ๋ฒ 10์ 30๋ถ ๊ฒฝ์ @sinbom ๋๊ป ํ์ธํ ๊ฒฐ๊ณผ ์์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ์์ ์ด ํ์ํฉ๋๋ค!
state
, nonce
์์ฑ ๋ก์ง ์ ๊ฑฐ์ด์ ์์ผ๋ก CSRF ๋ฐ Replay attack์ ๋ง๊ธฐ ์ํ ์์ฒญ ํ๋ผ๋ฏธํฐ์ ์์ฑ/๊ฒ์ฆ ์ฃผ์ฒด๋ ๋ฐฑ์๋๊ฐ ๋ ๊ฒ์ ๋๋ค!
redirect
page ์ ๊ฑฐOauth๋ฅผ ์ํ redirect page
๋ ๋์ด์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ์ค๋ก์ง ๋ฆฌ๋ค์ด๋ ํธ๋ ๋ฐฑ์๋์์์ ์๋ต์ ๋ฐ๋ผ ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋์์ผ์ค ๊ฒ์
๋๋ค.
redirect_uri
์ค์ ๋ฐ ํ๋ก ํธ์๋ ์ธก์ ์ ๋ฌ๋ฐฑ์๋ ์ธก์์ ํด๋น ๋ณ์๋ฅผ ์ ๊ฒ ์๋ ค์ฃผ์๋ฉด, ํ๊ฒฝ ๋ณ์์ ์ถ๊ฐํ๊ฒ ์ต๋๋ค :)
UX์ ์ค๋จ ์์ด ์์ฐ์ค๋ฝ๊ฒ ๋ก๊ทธ์ธ ์ฒ๋ฆฌ๋ฅผ ์ํ silent refresh
์ ๋ต์ ๋ํด ๊ณ ๋ฏผํด๋ณด๊ฒ ์ต๋๋ค!
ํ์ฌ ํ์
๊ฒฐ๊ณผ, ์ฟ ํค์ ๊ดํ ๋ธ๋ผ์ฐ์ ๋ณ ์ด์๊ฐ ์๋ ๊ฒ ๊ฐ์, ์ด๋ฅผ ํ ๋ฒ playground
๋ ํฌ๋ฅผ ํ์, ํ
์คํธ ํ ์ ์ฉํด๋ณด๊ฒ ์ต๋๋ค~
์ด๋ถ ์ํด๋ณต ๋ง์ด ๋ฐ์ผ์ธ์ผ...
๋ฉ์ถฐ! ๐๐ป ์ ์ ์ฒดํฌ ๋ค์ด๊ฐ๋๋ค~
๋ฐฐ๊ฒฝ ๋ฐ ์ค๋ช
์ฌ์ฌ Oauth๋ฅผ ์ํด ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ง์ด๋ ค ํ๋ค.
ํ ์คํธ ์ฝ๋์ ๋ํ ์์ฑ ์์ ์ข ๋ฒ์ด๋์์ธ์ง, ์์ง ๋ง์์ ๋ณต์กํ์ง๋ง ์ ๋๋ก ํ๋ก์ ํธ๋ฅผ ํ ๋ง์์ ์๊ฒผ๋ค. ์ผ๋จ ๋ด์ผ์ด๋ฉด ๋์์ธ ํจํด์ ๋ชจ๋ ๊ณต๋ถํ๊ธฐ ๋๋ฌธ์, ์ฌ๋ฆฌ์ ์ธ ์ฌ์ ๊ฐ ์๊ฒผ๋ค. ๋ฐ๋ผ์ ํ์ฌ ์จ์ ๋ ํฐ ๋ฐฑ์๋ ํ์ ์ํํ ์์ ์ ๋๊ธฐ ์ํด, ๋ณธ๊ฒฉ์ ์ผ๋ก ์์ง์ด๋ ค ํ๋ค.
JavaScript Applications obtaining tokens directly
์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ๊ฒฐ๊ณผ์ ์ผ๋ก ๋ฆฌ๋ค์ด๋ ํธ๋ฅผ ํด๋ผ์ด์ธํธ ๋จ์์ ํ๊ธฐ๋ก ํ๋ค. ๋ํ ํ ํฐ์ ์ ์ฅํ ๊ณต๊ฐ์ ๋ถ๋ช ํ์ํด ๋ณด์ธ๋ค. ์ด๋ฅผ ์ต์ ํํ๊ธฐ ์ํ ๋ฐฉ์์ ๊ณ ๋ฏผํ์ฌ, ๋ฉ์ง Oauth๋ฅผ ๊ตฌํํ๋ ค ํ๋ค.
๊ธฐ๋๊ฒฐ๊ณผ
์ฌ์ฉ์
๋Oauth ๋ฒํผ
์ ๋๋ฅด๋ฉดOauth ๋ก๊ทธ์ธ ํ์ด์ง
๋ก ์ด๋ํ๋ค.๋ ์ ์์ ์ผ๋ก
Oauth ๋ก๊ทธ์ธ์ ํ๋ค๋ฉด
Redirect Page`๋ก ์ด๋ํด์ผ ํ๋ค.Redirect Page
๋ code, state๋ฅผ ๊ฐ์ ธ์์ผ ํ๋ค.state
๋ CSRF ๊ณต๊ฒฉ์ ํจ๊ณผ์ ์ผ๋ก ์ฐจ๋จํ๊ธฐ ์ํด string์ Randomํ๊ฒ ์์ฑํ๋๋ก ์ค๊ณํด์ผ ํ๋ค.Redirect Page
์ ๋ค์ด์๋ฉด ๋ฐ๋กstate
๊ฐ ์ ํจํ๋ฉดSeeyouletter Auth Server
์code, state
๋ฅผ ์ ๋ฌํ๋ API๋ฅผ ์ถ๊ฐํด์ผ ํ๋ค. (ํ์ฌ: ๋ชจํนํ ์์ ์ด๋ค.)๋ชจํนํ API
๊ฐ true๋ก ๋ฐํ๋๋ฉดIndexPage
๋ก ์ด๋ํด์ผ ํ๋ค.๋ชจํนํ API
๊ฐ false๋ก ๋ฐํ๋๋ฉด๋ชจ๋ฌ
๋ก์๋ฌ๋ฉ์์ง
๊ฐ ๋์ค๋ฉฐLoginPage
๋ก replace๋์ด์ผ ํ๋ค.๋์ ์ ์
Cache Storage API ์ฌ์ฉ
์์ง ์จ๋ณธ ์ ์ ์์ง๋ง, HTTP ์์์ ์บ์๋ฅผ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ฐ์ฅ ๋์ ๋์์ด๋ผ๊ณ ์๋ ค์ ธ ์๋ค. ์ฌ์ฉํด๋ณธ ์ ์ ์์ด์, ์ด์ฐธ์ ์ด ์ญ์ ๊ณต๋ถ๋ฅผ ํด๋ณด๊ณ ์ ์ฉํด๋ณด๊ณ ์ ํ๋ค.
์ฐธ๊ณ ์๋ฃ