ν΄λΉ κΈμ CS μ€ν°λμμ 곡λΆν λ΄μ©μ κΈ°λ°μΌλ‘ μμ±λμμ΅λλ€.
μ΄λ²μ μ°ν μ½ λ―Έμ μ μννλ©° μΊμ κ΄λ ¨ νμ΅ν μ€νΈλ₯Ό μ§ννλ€.
μΊμκ° λ¬΄μμΈμ§, μ΄λ€ μμΌλ‘ λμνλ μ§μ λν΄ μκ²λ§ μκ³ μλ¨ κ²μ μμλ€.
μ²μμ μΊμκ° μΉ μΊμλ§ μλ μ€ μκ³ , μ€ν°λ μ£Όμ μ μ μ μΊμλ₯Ό λ€νΈμν¬ λΆμΌ μμλ§ λ£μλ€!
μ°Ύμ보λ κ·Έ μ΄λ€ κ³³μ΄λ (λ©λͺ¨λ¦¬λ , L1~L3λ !) λ°μ΄ν° μ κ·Όμ μν΄ ν λΉν΄λλ μ₯μμλ€.
μ΄λ²μ κ·Έμ€ μΉμΊμλ‘ νμ μ§μ΄ μν°ν΄μ μ°Ύμ보며 곡λΆν΄λ³΄μλ€.
μΊμ λ λ°μ΄ν°λ κ°μ μμλ‘ λ³΅μ¬ν΄λλ μμ μ₯μμ΄λ€. μΊμμ μ κ·Ό μκ°μ λΉν΄ μλ λ°μ΄ν°λ₯Ό μ κ·Όνλ μκ°μ΄ μ€λ 걸리λ κ²½μ°λ κ°μ λ€μ κ³μ°νλ μκ°μ μ μ½νκ³ μΆμ κ²½μ°μ μ¬μ©νλ€.
μ£Όμ΄μ§ 리μμ€μ 볡μ¬λ³Έμ μΊμμ μ μ₯νκ³ μλ€κ°, μμ² μ κ·Έκ²μ μ 곡νλ κΈ°μ μ΄λ€.
ν΄λΌμ΄μΈνΈμ κ²½μ°, μΊμ±μ ν΅ν΄ μΉμ¬μ΄νΈκ° μ’ λ λΉ λ₯΄κ² λ°μνλλ‘ λ§λ€ μ μλ€. μ¦ μ±λ₯μ΄ ν₯μλλ€.
μλ² μμ κΈ°μ‘΄μ μ€λ λ°μ΄ν°κ° μ€μ§ μκ² λλ μμ² λΆνλ₯Ό μ€μΌ μ μλ€.
λλ€ μΉ λΈλΌμ°μ μμμ μ μ₯λλ μ 보μ΄μ§λ§ κ·Έ μ°μμκ° λ€λ₯΄λ€.
μΏ ν€λ μ¬μ©μ μΈμ¦ μ 보λ₯Ό μ μ₯νλ μ©λμ΄λ€. λ€μ μ¬μ©μ μ¬μΈμ¦(λ‘κ·ΈμΈ λ±)μ κ±°μΉμ§ μμλ λλ€λ νΈλ¦¬ν¨ λλ¬Έμ μ¬μ©λλ€.
μΊμλ μΉμ¬μ΄νΈκ° λ€μ μλ²λ‘ μμ²μ 보λ΄μ§ μμλ λλ μ±λ₯μ μ΄μ μ΄ μλ€. μ£Όλ‘ JS, CSS λ±μ νμΌλ€μ΄ μΊμ±λλ€.
μΉ λΈλΌμ°μ μ μ μ₯λλ μΊμ. νλͺ μ μ¬μ©μλ§ μ¬μ©νλ€.
λ€λ₯Έ μ¬λμ μ κ·Όν μ μλ€.
μΉ λΈλΌμ°μ μ μλ² μ¬μ΄μμ λμνλ€. νλͺ μ΄μμ μ¬μ©μκ° μ¬μ¬μ©ν μ μλ€.
Proxy Cache
μ Managed Cache
λ‘ λλλ€.
Proxy Cache
λ ν¬μλ νλ‘μμμ λμνλ μΊμμ΄λ€.Managed Cache
λ AWSλ Cloudfront λ± CDN μλΉμ€, 리λ²μ€ νλ‘μμμ λμνλ μΊμμ΄λ€. μ΄λ° μΊμλ€μ κ΄λ¦¬μ ν¨λμ΄λ 리λ²μ€ νλ‘μ μ€μ μΌλ‘ κ΄λ¦¬ κ°λ₯ν΄ Managed Cache
(κ΄λ¦¬λλ μΊμ)λΌκ³ λΆλ¦°λ€.A shared cache must not use a cached response to a request with an Authorization header field (Section 4.2 of [RFC7235]) to satisfy any subsequent request unless a cache directive that allows such responses to be stored is present in the response.
RFC7234
μλ² μλ΅ ν€λ μ€ Authorization
μ΄ ν¬ν¨λμ΄ μμ μ Shared Cache
μ μ μ₯λμ§ μλλ€.
Cache-Control
μΊμ± μ μ΄λ₯Ό μν΄ Cache-Control
μ΄λΌλ HTTP ν€λλ₯Ό μ΄λ€.
ν΄λΉ ν€λκ° μμ μ ν΄λ¦¬μ€ν± μΊμ±(μ묡μ μΊμ±)μ΄ μΌμ΄λ μ μλ€.
μΊμ±νμ§ μμ μ no-store
μ μ¬μ©νλ€. μλ² μλ΅μ μ ν μ μ₯νμ§ μλλ€.
μΊμ±νμ§λ§ μ¬κ²μ¦, μ¦ μ ν¨μ± νμΈμ νκ³ μΆμ λ no-cache
λ₯Ό μ¬μ©νλ€.
μΉμΊμ μΌκ΄μ± κΈ°λ² μ€ polling-every-time
(λ§€λ² μ¬κ²μ¦-μ ν¨μ± νμΈ) ννλ₯Ό μ¬μ©νκ² λλ€.
public
μ μλ΅ μ μ΄λ€ μΊμμμ μΊμ±λμ΄λ μ’λ€λ λ»μ΄λ€. 곡μ μΊμμ μ μ₯λμ΄λ μ’λ€.
private
μ μλ΅μ λ¨μΌ μ¬μ©μλ§μ μν΄ μ¬μ©ν΄μΌ νλ©°, 곡μ μΊμμ μ μ₯λλ©΄ μλλ€λ λ»μ΄λ€.
max-age
λ‘ μΊμμ μ΅λ μλͺ
μ€μ μ΄ κ°λ₯νλ€. λ¨μλ βμ΄β μ΄λ€.
μΊμλ λ°μ΄ν°κ° μ ν¨ν λ fresh(μ μ ν)λΌκ³ ,
μΊμ μκ°μ΄ μ΄κ³Όλ κ²½μ° stale(μ μ νμ§ μμ)λΌκ³ νλ€.
μμ μ κ΄λ ¨ν΄ Expires
ν€λλ₯Ό μΌμ§λ§, μ§κΈμ μ μ°μ§ μλλ€.
must-revalidate
μ¬μ© μ, μ€λλ 리μμ€λ₯Ό μ¬μ©νκΈ° μ μνλ₯Ό νμΈνκΈ° μν΄ μΊμ κ²μ¦μ μ§ννκ² λλ€.
μμ μ max-age=0
κ³Ό ν¨κ» μ΄ ν€λλ₯Ό μΌμ§λ§, μ§κΈμ no-cache
λ‘ μ¬κ²μ¦μ μ§ννλ€. max-age=0
μ΄ λ¨Ήνμ§ μλ λΈλΌμ°μ κ° μμ΄μ κ·Έλ λ€κ³ νλ€.
μΊμ μ ν¨κΈ°κ°μ΄ μ§λ¬μ λ, μλ²μ λ°μ΄ν°κ° μ¬μ ν μΊμ±λ λ°μ΄ν°μ κ°μ μ μλ€.
μ΄λ νΈλν½ λλΉλ₯Ό μ€μ΄κΈ° μν΄ μΊμ κ²μ¦ λ° μ‘°κ±΄λΆ μμ²μ ν μ μλ€.
λ³΄ν΅ μ¬μ©μκ° λ¦¬λ‘λ λ²νΌμ λλ μ κ²½μ° μ΄λ°λλ€.
no-cache
λ must-revalidate
μ¬μ© μ, μΌλ°μ μΈ λΈλΌμ°μ§ μ€μλ μ΄λ°λλ€.
μΊμ κ²μ¦μ μν λκ°μ§ λ°©λ²μ΄ μλ€.
리μμ€μ λ§μ§λ§ κ°±μ μκ°μΌλ‘ κ²μ¦ν¨.
첫 μμ²
Last-Modified
ν€λμ μμ²ν 리μμ€κ° λ§μ§λ§μΌλ‘ μμ λ μΌμκ° λ€μ΄κ°λ€. λΈλΌμ°μ λ μ΄ μΌμλ₯Ό μ μ₯νλ€.
μ‘°κ±΄λΆ μμ²
μ΄ν μΊμ κΈ°κ°μ΄ μ΄κ³Όλ μμ²μ λ°μμ μ, λΈλΌμ°μ λ μ΄ μΌμ κ°μ If-Modified-Since
μμ² ν€λμ λ£μ΄ μλ²λ‘ μ λ¬νλ€.
λ§μ½ μλ³Έ 리μμ€μ λ³κ²½μ¬νμ΄ μμΌλ©΄ 304(Not Modified) μνμ½λλ‘ μλ΅νλ€. ν΄λΉ μλ΅μ λ°λκ° λΉμ΄μλ€.
λ³κ²½μ¬νμ΄ μμ μ 200(OK)λ₯Ό μλ΅νλ€. ν΄λΉ μλ΅μ μλ²μμ μ¨ λ°λκ° μλ€.
리μμ€μ μλ³μλ₯Ό κΈ°μ€μΌλ‘ κ²μ¦ν¨.
첫 μμ²
μ΅μ΄ μμ² μ ETag
μλ΅ ν€λκ° λμμ¨λ€. μμ²ν 리μμ€μ νμ¬ λ²μ μ λν ν΄μ μλ³μμ΄λ€. λΈλΌμ°μ λ μ΄ κ°μ μ μ₯νλ€.
μ‘°κ±΄λΆ μμ²
μ΄ν μΊμ κΈ°κ°μ΄ μ΄κ³Όλ μμ²μ λ°μμ μ, If-None-Match
ν€λμ ν΄λΉ κ°μ λ£μ΄ 보λΈλ€.
μ΄ κ²½μ°μλ λ³κ²½μ¬νμ΄ μμΌλ©΄ 304 μνμ½λλ‘ μλ΅νλ€.
Vary
ν€λλ μΊμ±μ ν μ§ κ²°μ νκΈ° μν΄, μμ² ν€λλ₯Ό λμ‘°νλ λ°©μμ κ²°μ νλ€.
μΊμκ° Vary
ν€λκ° ν¬ν¨λ μμ²μ μμ ν κ²½μ°, Vary
μ μ§μ λ λͺ¨λ ν€λ νλκ° μΊμ±λ μλ μμ²κ³Ό λμ‘°λλ€. λμ΄ κ°μ§ μλ€λ©΄ μΊμ±λ μλ΅μ μ¬μ©νμ§ μλλ€.
Vary
λ μ£Όμν΄μ μ¬μ©ν΄μΌ νλ€. μΊμμ ν¨κ³Όλ₯Ό λ¨μ΄λ¨λ¦΄ μ μλ€. μ¬κΈ°μ μ§μ λ ν€λκ°μ΄ μ¬λ¬κ°μ§μΈ κ²½μ°, μ κ·νκ° νμνλ€.
μΊμ μλ²λ κΈ°λ³Έμ μΌλ‘ ν€λμ ν€λ κ°μ΄ μ νν κ°μ μμ²λ§ 맀μΉμν¨λ€.
Accept-Encoding: gzip,deflate,sdch,
Accept-Encoding: gzip,deflate,
Accept-Encoding: gzip
μλ μλ²κ° λͺ¨λ μμ²μ λν΄ λκ°μ 리μμ€(gzip
)λ₯Ό μλ΅ νλλΌλ, κ°κ° λ€λ₯Έ μΊμ μνΈλ¦¬κ° μμ±λλ€.
// μλμ½λ
// Accept-Encoding μ κ·ν
if (req.http.Accept-Encoding) {
if (req.http.Accept-Encoding ~ "gzip") {
set req.http.Accept-Encoding = "gzip";
}
// μλ κ²½μ°, λ€λ₯Έ encoding typeλ€μ 체ν¬νλ€.
else {
unset req.http.Accept-Encoding;
}
}
λ°λΌμ, μ΄λ₯Ό λ§κΈ° μν΄ μΊμ μλ²λ μμ²μ μ μ²λ¦¬ν΄μ νμν νμΌλ§ μΊμν΄μΌ νλ€.
λ³΄ν΅ μ μ 리μμ€μ κ²½μ° μΊμ±νλ€. νμ§λ§ μλ°μ€ν¬λ¦½νΈμ cssλ κ°λ°μ΄ μ§νλ¨μ λ°λΌ μμ£Ό λ³κ²½λκ³ , μλ°μ€ν¬λ¦½νΈμ CSS 리μμ€ λ²μ μ΄ λκΈ°νλμ§ μμΌλ©΄ νλ©΄μ΄ κΉ¨μ§λ€.
μΊμλ URLμ κΈ°λ°μΌλ‘ 리μμ€λ₯Ό ꡬλΆνλ€. μ΄λ μΊμ 무ν¨νλ₯Ό νλ λ°©λ²μ΄ μλ€. μ μ νμΌμ URLμ λ²μ μ μΆκ°ν΄ μΊμ 무ν¨νλ₯Ό νλ€. 리μμ€κ° μ λ°μ΄νΈ λ λλ§λ€ URLμ λ³κ²½νλ κ²μ΄λ€.
μΊμ 무ν¨νλ₯Ό νλ©΄ μ΅λν μ€λ«λμ μΊμ±νλ©΄μλ, μλ‘μ΄ λ¦¬μμ€λ‘ λ°λ μ λ°λ‘ λ°λ μΊμλ₯Ό ν΄λΌμ΄μΈνΈμκ² μ 곡ν μ μλ€.
쿼리 λ¬Έμμ΄μ μΊμ± λ¬Έμ λ₯Ό λ°μμν¨λ€?!π€― μΌλΆ νλ‘μ λλ CDNμ 쿼리 λ¬Έμμ΄μ΄ ν¬ν¨λ νμΌμ μΊμν μ μμΌλ―λ‘ μ¬μ©νμ§ μλ κ²μ΄ μ’λ€.
νμΌ μ΄λ¦μ΄λ κ²½λ‘κ° μμ λλ©΄ ν΄λΉ νμΌμ μ°Έμ‘°νλ HTML(Main Resource)λ μ λ°μ΄νΈ ν΄μΌ νλ€. λν HTML νμΌμ λλλ‘ μΊμ±λμ΄μ μλλ€. μΊμ±νκ³ μΆλ€λ©΄, ETag λ±μ ν΅ν΄ κ°μ μ¬κ²μ¦ ν΄μ€μΌ νλ€.
κ΄λ ¨ν΄ μλ£λ₯Ό μ°Ύμ보며, μ λͺ μ¬μ΄νΈ(ꡬκΈ, λ€μ΄λ² λ±)μ ν΅μ μ λΆμν΄λ΄€λ€.
μκ°λ³΄λ€ MDN
μμ κΆμ₯λμ§ μλ ν€λλ€μ΄ λ§μ΄ μ¬μ©λκ³ μμλ€. νΉν Pragma
ν€λκ° HTTP 1.1
μμλ λ§μ΄ 보μλ€. μμΌκΉ? μμ μ± λλ¬ΈμΌκΉ?
λΉμ·ν μκΈ°λ‘ must-revalidate
μμ μμ£Ό 보μλ€. μκ°ν΄ 보μλλ°, λ κ±°μμΌ μλ μμ§λ§ νΈνμ±μ μν΄μ κ·Έλλ‘ λ κ²μΌ μλ μμ κ² κ°λ€.
νμ μμ λ΅μ μ°Ύμ μ μκ² μ§?π€