Cookie - g-market/b-shop-backend GitHub Wiki
Cookie
μΏ ν€λ λΈλΌμ°μ μ μ μ₯λλ μμ ν¬κΈ°μ λ¬Έμμ΄λ‘ HTTP νλ‘ν μ½μ μΌλΆμ λλ€.
μΏ ν€λ μ£Όλ‘ μΉ μλ²μ μν΄ λ§λ€μ΄μ§λλ€.
μλ²κ° HTTP μλ΅ ν€λ(header)μ Set-Cookieμ λ΄μ©μ λ£μ΄ μ λ¬νλ©΄, λΈλΌμ°μ λ μ΄ λ΄μ©μ μ체μ μΌλ‘ λΈλΌμ°μ μ μ μ₯ν©λλ€.
μΏ ν€λ ν΄λΌμ΄μΈνΈ μλ³κ³Ό κ°μ μΈμ¦μ κ°μ₯ λ§μ΄ μ°μ λλ€.
- μ¬μ©μκ° λ‘κ·ΈμΈνλ©΄ μλ²λ HTTP μλ΅ ν€λμ Set-Cookieμ λ΄κΈ΄ access token μ¬λ°κΈ μ©λ μ 보λ₯Ό μ¬μ©ν΄ μΏ ν€λ₯Ό μ€μ
- μ¬μ©μκ° λμΌ λλ©μΈμ μ μνλ €κ³ νλ©΄ λΈλΌμ°μ λ HTTP Cookie ν€λμ Refresh Tokenμ ν¨κ» μ€μ΄ μλ²μ μμ²μ 보λ λλ€.
- μλ²λ λΈλΌμ°μ κ° λ³΄λΈ μμ² ν€λμ Refresh Tokenλ₯Ό μ½μ΄ μ¬μ©μμκ² access tokenμ μ¬λ°κΈν©λλ€.
Cookie Option
refreshToken=61da9252-c1f7-11ed-a50e-02f2f3f2da68;
Path=/;
Max-Age=1209600;
Expires=Mon, 27 Mar 2023 23:32:56 GMT;
Secure;
HttpOnly;
SameSite=None
path
path=/
URL path(κ²½λ‘)μ μ λμ¬λ‘, μ΄ κ²½λ‘λ μ΄ κ²½λ‘μ νμ κ²½λ‘μ μλ νμ΄μ§λ§ μΏ ν€μ μ κ·Όν μ μμ΅λλ€. μ λ κ²½λ‘μ΄μ΄μΌ νκ³ , (λ―Έ μ§μ μ) κΈ°λ³Έκ°μ νμ¬ κ²½λ‘μ λλ€.
path=/admin μ΅μ μ μ¬μ©νμ¬ μ€μ ν μΏ ν€λ /adminκ³Ό /admin/somethingμμ λ³Ό μ μμ§λ§, /home μ΄λ /adminpageμμ μΏ ν€λ₯Ό λ³Ό μ μμ΅λλ€.
νΉλ³ν κ²½μ°κ° μλλΌλ©΄, path μ΅μ μ path=/ κ°μ΄ 루νΈλ‘ μ€μ ν΄ μΉμ¬μ΄νΈμ λͺ¨λ νμ΄μ§μμ μΏ ν€μ μ κ·Όν μ μλλ‘ ν©μλ€.
domain
domain=site.com
μΏ ν€μ μ κ·Ό κ°λ₯ν domain(λλ©μΈ)μ μ§μ ν©λλ€. λ€λ§, λͺ κ°μ§ μ μ½μ΄ μμ΄μ μ무 λλ©μΈμ΄λ μ§μ ν μ μμ΅λλ€.
domain μ΅μ μ μ무 κ°λ λ£μ§ μμλ€λ©΄, μΏ ν€λ₯Ό μ€μ ν λλ©μΈμμλ§ μΏ ν€μ μ κ·Όν μ μμ΅λλ€. site.comμμ μ€μ ν μΏ ν€λ other.comμμ μ»μ μ μμ£ .
μ΄ μΈμ κΉλ€λ‘μ΄ μ μ½μ¬νμ΄ νλ λ μμ΅λλ€. μλΈ λλ©μΈ(subdomain)μΈ sub.site.comμμλ μΏ ν€ μ 보λ₯Ό μ»μ μ μλ€λ μ μ λλ€.
μλΈ λλ©μΈμ΄λ λ€λ₯Έ λλ©μΈμμ μΏ ν€μ μ μν λ°©λ²μ μμ΅λλ€. site.comμμ μμ±ν μΏ ν€λ₯Ό other.comμμ μ λ μ μ‘λ°μ μ μμ΅λλ€.
κ·Έλ°λ° μ λ§ forum.site.comκ³Ό κ°μ μλΈ λλ©μΈμμ site.comμμ μμ±ν μΏ ν€ μ 보λ₯Ό μ»μ λ°©λ²μ΄ μλ κ±ΈκΉμ?
λ°©λ²μ΄ μμ΅λλ€. site.comμμ μΏ ν€λ₯Ό μ€μ ν λ domain μ΅μ μ λ£¨νΈ λλ©μΈμΈ domain=site.comμ λͺ μμ μΌλ‘ μ€μ ν΄ μ£Όλ©΄ λμ£ .
expiresμ max-age
Expires=Mon, 27 Mar 2023 23:32:56 GMT; Max-Age=1209600;
expires(μ ν¨ μΌμ)λ max-age(λ§λ£ κΈ°κ°) μ΅μ μ΄ μ§μ λμ΄μμ§ μμΌλ©΄, λΈλΌμ°μ κ° λ«ν λ μΏ ν€λ ν¨κ» μμ λ©λλ€. μ΄λ° μΏ ν€λ₯Ό "μΈμ μΏ ν€(session cookie)"λΌκ³ λΆλ¦ λλ€.
expires λ max-age μ΅μ μ μ€μ νλ©΄ λΈλΌμ°μ λ₯Ό λ«μλ μΏ ν€κ° μμ λμ§ μμ΅λλ€.
λΈλΌμ°μ λ μ€μ λ μ ν¨ μΌμκΉμ§ μΏ ν€λ₯Ό μ μ§νλ€κ°, ν΄λΉ μΌμκ° λλ¬νλ©΄ μΏ ν€λ₯Ό μλμΌλ‘ μμ ν©λλ€.
μΏ ν€μ μ ν¨ μΌμλ λ°λμ GMT(Greenwich Mean Time) ν¬λ§·μΌλ‘ μ€μ ν΄μΌ ν©λλ€.
secure
secure
μ΄ μ΅μ μ μ€μ νλ©΄ HTTPSλ‘ ν΅μ νλ κ²½μ°μλ§ μΏ ν€κ° μ μ‘λ©λλ€.
secure μ΅μ μ΄ μμΌλ©΄ κΈ°λ³Έ μ€μ μ΄ μ μ©λμ΄ http://site.com μμ μ€μ (μμ±)ν μΏ ν€λ₯Ό https://site.com μμ μ½μ μ μκ³ , https://site.com μμ μ€μ (μμ±)ν μΏ ν€λ http://site.com μμ μ½μ μ μμ΅λλ€.
μΏ ν€λ κΈ°λ³Έμ μΌλ‘ λλ©μΈλ§ νμΈνμ§ νλ‘ν μ½μ λ°μ§μ§ μκΈ° λλ¬Έμ λλ€.
νμ§λ§ secure μ΅μ μ΄ μ€μ λ κ²½μ°, https://site.com μμ μ€μ ν μΏ ν€λ http://site.com μμ μ κ·Όν μ μμ΅λλ€. μΏ ν€μ λ―Όκ°ν λ΄μ©μ΄ μ μ₯λμ΄ μμ΄ μνΈνλμ§ μμ HTTP μ°κ²°μ ν΅ν΄ μ λ¬λλ κ±Έ μμΉ μλλ€λ©΄ μ΄ μ΅μ μ μ¬μ©νλ©΄ λ©λλ€.
samesite
SameSite=None
λ λ€λ₯Έ 보μ μμ±μΈ samesite μ΅μ μ ν¬λ‘μ€ μ¬μ΄νΈ μμ² μμ‘°(cross-site request forgery, XSRF) 곡격μ λ§κΈ° μν΄ λ§λ€μ΄μ§ μ΅μ μ λλ€.
XSRF 곡격
νμ¬ Johnμ΄ bank.comμ λ‘κ·ΈμΈλμ΄μλ€κ³ κ°μ ν΄ λ΄ μλ€. ν΄λΉ μ¬μ΄νΈμμ μ¬μ©λλ μΈμ¦ μΏ ν€κ° λΈλΌμ°μ μ μ μ₯λκ³ , λΈλΌμ°μ λ bank.comμ μμ²μ λ³΄λΌ λλ§λ€ μΈμ¦ μΏ ν€λ₯Ό ν¨κ» μ μ‘ν κ²μ λλ€. μλ²λ μ μ‘λ°μ μΏ ν€λ₯Ό μ΄μ©ν΄ μ¬μ©μλ₯Ό μλ³νκ³ , 보μμ΄ νμν μ¬μ κ±°λλ₯Ό μ²λ¦¬ν©λλ€.
μ΄μ (λ‘κ·Έμμνμ§ μκ³ ) λ€λ₯Έ μ°½μ λμμ μΉ μνμ νλ λμ€μ λ»νμ§ μκ² aliceκ° bob.comμ μ μνλ€ κ°μ ν΄ λ΄ μλ€. μ΄ μ¬μ΄νΈμ bobμκ² μ‘κΈμ μμ²νλ νΌ(form) <form action="https://bank.com/pay">" μ΄ μκ³ , μ΄ νΌμ μλμΌλ‘ μ μΆλλλ‘ μ€μ λμ΄ μμ΅λλ€.
νΌμ΄ bob.comμμ μν μ¬μ΄νΈλ‘ λ°λ‘ μ μ‘λ λ μΈμ¦ μΏ ν€λ ν¨κ» μ μ‘λ©λλ€. bank.comμ μμ²μ λ³΄λΌ λλ§λ€ bank.comμμ μ€μ ν μΏ ν€κ° μ μ‘λκΈ° λλ¬Έμ λλ€. μνμ μ μ‘λ°μ μΏ ν€λ₯Ό μ½μ΄ (ν΄μ»€κ° μλ) κ³μ μ£ΌμΈμ΄ μ μν κ²μ΄λΌ μκ°νκ³ ν΄μ»€μκ² λμ μ‘κΈν©λλ€.
μ΄λ° 곡격μ ν¬λ‘μ€ μ¬μ΄νΈ μμ² μμ‘°λΌκ³ λΆλ¦ λλ€.
μ€μ μνμ λΉμ°ν μ΄ κ³΅κ²©μ λ§μ μ μλλ‘ μμ€ν μ μ€κ³ν©λλ€. bank.comμμ μ¬μ©νλ λͺ¨λ νΌμ "XSRF λ³΄νΈ ν ν°(protection token)"μ΄λΌλ νΉμ νλλ₯Ό λ£μ΄μ λ§μ΄μ£ . μ΄ ν ν°μ μ μμ μΈ νμ΄μ§μμ λ§λ€ μ μκ³ , μ격 νμ΄μ§μμλ νμ³ μ¬ μ μλλ‘ κ΅¬νλμ΄ μμ΅λλ€. λ°λΌμ μ μμ μΈ νμ΄μ§μμ νΌμ μ μ‘νλλΌλ λ³΄νΈ ν ν°μ΄ μκ±°λ μλ²μ μ μ₯λ κ°κ³Ό μΌμΉνμ§ μκΈ° λλ¬Έμ μμ²μ΄ 무μ©μ§λ¬Όμ΄ λ©λλ€.
νμ§λ§ μ΄λ° μ μ°¨λ ꡬνμ μκ°μ΄ κ±Έλ¦°λ€λ λ¨μ μ μλ°ν©λλ€. λͺ¨λ νΌμ λ³΄νΈ ν ν°μ μΈν ν΄μ€μΌ νμ£ . λν μμ² μ λΆλ₯Ό κ²μν΄μΌ ν©λλ€.
httpOnly
httpOnly μ΅μ μ μΉμλ²μμ Set-Cookie ν€λλ₯Ό μ΄μ©ν΄ μΏ ν€λ₯Ό μ€μ ν λ μ§μ ν μ μμ΅λλ€.
μ΄ μ΅μ μ μλ°μ€ν¬λ¦½νΈ κ°μ ν΄λΌμ΄μΈνΈ μΈ‘ μ€ν¬λ¦½νΈκ° μΏ ν€λ₯Ό μ¬μ©ν μ μκ² ν©λλ€. document.cookieλ₯Ό ν΅ν΄ μΏ ν€λ₯Ό λ³Ό μλ μκ³ μ‘°μν μλ μμ΅λλ€.
ν΄μ»€κ° μ μμ μΈ μλ°μ€ν¬λ¦½νΈ μ½λλ₯Ό νμ΄μ§μ μ½μ νκ³ μ¬μ©μκ° κ·Έ νμ΄μ§μ μ μνκΈ°λ₯Ό κΈ°λ€λ¦¬λ λ°©μμ 곡격μ μλ°©ν λ μ΄ μ΅μ μ μ¬μ©ν©λλ€. μ°λ¦¬κ° λ§λ μ¬μ΄νΈμ ν΄μ»€κ° μ μμ μΈ μ½λλ₯Ό μ½μ νμ§ λͺ»νλλ‘ μλ°©ν΄μΌ νμ§λ§, λ²κ·Έκ° μμ νλ₯ μ μΈμ λ μκΈ° λλ¬Έμ ν΄μ»€κ° μ½λλ₯Ό μ½μ ν κ°λ₯μ±μ΄ μμ μ μμ΅λλ€.
μ΄λ° μν©μ΄ λ§μ νλ λ°μνλ©΄, μ¬μ©μκ° μΉ νμ΄μ§μ λ°©λ¬Έν λ document.cookieλ₯Ό λ³Ό μ μκ³ μ‘°μλ ν μ μλ ν΄μ»€μ μ½λλ ν¨κ» μ€νλ©λλ€. λ¬Όλ‘ μΏ ν€μ μΈμ¦ μ λ³΄κ° μμ΄μ ν΄μ»€κ° μ΄ μ 보λ₯Ό νμΉκ±°λ μ‘°μν μ μκ² λ©λλ€. μ’μ§ μμ μν©μ΄ λ°μνμ£ .
νμ§λ§ httpOnly μ΅μ μ΄ μ€μ λ μΏ ν€λ document.cookieλ‘ μΏ ν€ μ 보λ₯Ό μ½μ μ μκΈ° λλ¬Έμ μΏ ν€λ₯Ό 보νΈν μ μμ΅λλ€.