Web/HTTP

๊ฒ€์ฆ ํ—ค๋”์™€ ์กฐ๊ฑด๋ถ€ ์š”์ฒญ

 

๐Ÿ“’ ๊ฒ€์ฆ ํ—ค๋”์™€ ์กฐ๊ฑด๋ถ€ ์š”์ฒญ

๋‹ค์‹œ ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ์™€ ์ด์ „์— ์š”์ฒญํ–ˆ์—ˆ๋˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐ™์€์ง€ ๋‹ค๋ฅธ์ง€ ์–ด๋–ป๊ฒŒ ํ™•์ธํ•˜์ง€?

๊ทธ๋ž˜์„œ ๋“ฑ์žฅํ•˜๋Š” ๊ฒ€์ฆ ํ—ค๋”!

๊ฒ€์ฆ ํ—ค๋”์—๋Š” ํฌ๊ฒŒ 2๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, Last-Modified์™€ ETag.

๐Ÿ“Œ ๊ฒ€์ฆ ํ—ค๋” - Last-Modified

๐Ÿ“ ๊ณผ์ •

1. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ์„œ๋ฒ„๊ฐ€ ์ด๋ ‡๊ฒŒ ๊ฒ€์ฆ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์‘๋‹ต์„ ๋ณด๋ƒ„.

HTTP/1.1 200 OK
Content-Type: image/jpeg
cache-control: max-age=60
Last-Modified: 2022๋…„ 1์›” 12์ผ 10:00:00
Content-Length: 34012

lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjklasl kjdfl;qkawj9;o4ruawsldkal;skdjfa;ow9ejkl3123123

'Last-Modified' ๋ผ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ˆ˜์ •๋œ ์‹œ๊ฐ„์„ ์ถ”๊ฐ€ํ•ด์„œ!!

2. ๊ทธ๋Ÿฌ๋ฉด ํด๋ผ์ด์–ธํŠธ๋Š” ๋ฐ์ดํ„ฐ์˜ ์ตœ์ข… ์ˆ˜์ •์ผ์„ ์ถ”๊ฐ€๋กœ ์บ์‹œ์— ์ €์žฅํ•จ.

3. ์ดํ›„ ๋‹ค์‹œ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ, ์บ์‹œ๋ฅผ ํ™•์ธํ•ด์„œ 'Last-Modified'๊ฐ€ ์žˆ์œผ๋ฉด ์š”์ฒญ์— if-modified-since: 2020๋…„ 11์›” 10์ผ 10:00:00 ๋ผ๋Š” ์š”์ฒญ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋ณด๋ƒ„. -> ์ด๋Ÿฐ ์š”์ฒญ์ด ์กฐ๊ฑด๋ถ€ ์š”์ฒญ

GET /fanxyellow.jpg
if-modified-since: 2022๋…„ 1์›” 12์ผ 10:00:00

4. ์„œ๋ฒ„๊ฐ€ ๊ฐ–๊ณ ์žˆ๋˜ ๋ฐ์ดํ„ฐ์˜ ์ตœ์ข… ์ˆ˜์ •์ผ๊ณผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ ์ตœ์ข… ์ˆ˜์ •์ผ์„ ๋น„๊ตํ•ด์„œ ํ™•์ธํ•จ.

5-1. ์ˆ˜์ • ์•ˆ๋์œผ๋ฉด? ์‹คํŒจ! HTTP Body ๋นผ๊ณ  304 Not Modified ๋ฅผ ์ถ”๊ฐ€ํ•œ ์‘๋‹ต์„ ๋ณด๋ƒ„.

HTTP/1.1 304 Not Modified
Content-Type: image/jpeg
cache-control: max-age=60
Last-Modified: 2022๋…„ 1์›” 12์ผ 10:00:00
Content-Length: 34012

* ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฒƒ์€ HTTP Body๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ!!! ์™œ๋ƒํ•˜๋ฉด ์ˆ˜์ •๋œ ๊ฒƒ์ด ์—†์œผ๋‹ˆ๊นŒ! ํ—ค๋”๋งŒ ์‘๋‹ต์œผ๋กœ ๋ณด๋‚ด!

ํด๋ผ์ด์–ธํŠธ๊ฐ€ '304 Not Modified'๋ฅผ ํ™•์ธํ•˜๋ฉด cache-control ํ—ค๋”๊ฐ’ ๊ฐฑ์‹ ํ•˜๊ณ  ์บ์‹œ ๋‹ค์‹œ ์…‹ํŒ…ํ•ด์„œ ๋ธŒ๋ผ์šฐ์ € ์บ์‹œ์—์„œ ๋ฐ”๋กœ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์žฌ์‚ฌ์šฉ!

5-2. ์ˆ˜์ • ๋์œผ๋ฉด? ์„ฑ๊ณต! 200 OK๋กœ Bodyํฌํ•จํ•ด์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋‹ค์‹œ ๋ณด๋ƒ„. ์ˆ˜์ •๋์œผ๋‹ˆ๊นŒ ์ˆ˜์ •๋ณธ ๋ณด๋‚ด์•ผ์ง€!

 

๐Ÿ“ ์ •๋ฆฌ

• ์บ์‹œ ์œ ํšจ ์‹œ๊ฐ„์ด ์ดˆ๊ณผํ•ด๋„, ์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์œผ๋ฉด, 304 Not Modified + ํ—ค๋” ๋ฉ”ํƒ€ ์ •๋ณด๋งŒ ์‘๋‹ต (Body X) 

• ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ์‘๋‹ต ํ—ค๋” ์ •๋ณด๋กœ ์บ์‹œ์˜ ๋ฉ”ํƒ€ ์ •๋ณด๋ฅผ ๊ฐฑ์‹  

• ํด๋ผ์ด์–ธํŠธ๋Š” ์บ์‹œ์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์žฌํ™œ์šฉ 

• ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋„คํŠธ์›Œํฌ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€๋งŒ ์šฉ๋Ÿ‰์ด ์ ์€ ํ—ค๋” ์ •๋ณด๋งŒ ๋‹ค์šด๋กœ๋“œ
• ๋งค์šฐ ์‹ค์šฉ์ ์ธ ํ•ด๊ฒฐ์ฑ…

 

๐Ÿ“ ๋‹จ์ 

• 1์ดˆ ๋ฏธ๋งŒ(0.x์ดˆ) ๋‹จ์œ„๋กœ ์บ์‹œ ์กฐ์ • ๋ถˆ๊ฐ€๋Šฅ 

• ๋‚ ์งœ ๊ธฐ๋ฐ˜์˜ ์ •ํ•ด์ง„ ๋กœ์ง๋งŒ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, 

• ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ๋‚ ์งœ๊ฐ€ ๋‹ค๋ฅด์ง€๋งŒ, ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•ด์„œ ๊ฒฐ๊ตญ ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ๋Š” ๋˜‘๊ฐ™์€๋ฐ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค ๋‹ค์‹œ ๋ฐ›์•„์•ผ ํ•จ.

 

๊ทธ๋ž˜์„œ, ์„œ๋ฒ„์—์„œ ๋ณ„๋„์˜ ์บ์‹œ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ (์˜ˆ๋ฅผ ๋“ค์–ด ์ŠคํŽ˜์ด์Šค๋‚˜ ์ฃผ์„์ฒ˜๋Ÿผ ํฌ๊ฒŒ ์˜ํ–ฅ์ด ์—†๋Š” ๋ณ€๊ฒฝ์—์„œ๋Š” ์บ์‹œ๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ)์—๋Š” ETag๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด๋จ.

 

๐Ÿ“Œ ๊ฒ€์ฆ ํ—ค๋” - ETag

๐Ÿ“ ETag

• Entity Tag

• ์บ์‹œ์šฉ ๋ฐ์ดํ„ฐ์— ์ž„์˜์˜ ๊ณ ์œ ํ•œ ๋ฒ„์ „ ์ด๋ฆ„์„ ๋‹ฌ์•„๋‘  .
์˜ˆ) ETag: "v1.0", ETag: "a2jiodwjekjl3"
• ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ด ์ด๋ฆ„์„ ๋ฐ”๊พธ์–ด์„œ ๋ณ€๊ฒฝํ•จ. (Hash๋ฅผ ๋‹ค์‹œ ์ƒ์„ฑ) 

์˜ˆ) ETag: "aaaaa" -> ETag: "bbbbb"

 

๐Ÿ“ ๊ณผ์ •

 1. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์ด๋ ‡๊ฒŒ ์ƒ๊ธด ETag๋ฅผ ํฌํ•จํ•œ ์‘๋‹ต์„ ๋ณด๋ƒ„.

HTTP/1.1 200 OK
Content-Type: image/jpeg
cache-control: max-age=60
ETag: "aaaaaaaaaa"
Content-Length: 34012

lkj123kljoiasudlkjaweioluywlnfdo912u34ljko98udjklasl kjdfl;qkawj9;o4ruawsldkal;skdjfa;ow9ejkl3123123

2. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ญ์‹œ ์‘๋‹ต ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅ

3. ์ดํ›„ ์š”์ฒญ์—์„œ ์บ์‹œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋์œผ๋ฉด 'If-None-Match' ํ—ค๋”๋กœ ETag๋ฅผ ํฌํ•จํ•ด์„œ ๋‹ค์‹œ ์š”์ฒญ์„ ๋ณด๋ƒ„.

GET /fanxyellow.jpg
If-None-Match: "aaaaaaaaaa"

4. ์„œ๋ฒ„๊ฐ€ ๋ฐ›์€ ETag์™€ ์›๋ž˜ ETag๋ฅผ ๋น„๊ต

5-1. ์ˆ˜์ • ์•ˆ๋์œผ๋ฉด? ์‹คํŒจ! HTTP Body ๋นผ๊ณ  304 Not Modified๋ฅผ ์ถ”๊ฐ€ํ•œ ์‘๋‹ต์„ ๋ณด๋ƒ„. 

5-2. ์ˆ˜์ • ๋์œผ๋ฉด? ์„ฑ๊ณต! 200 OK๋กœ Bodyํฌํ•จํ•ด์„œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๋‹ค์‹œ ๋ณด๋ƒ„.

 

๐Ÿ“ ์ •๋ฆฌ

• ์ง„์งœ ๋‹จ์ˆœํ•˜๊ฒŒ ETag๋งŒ ์„œ๋ฒ„์— ๋ณด๋‚ด์„œ ๊ฐ™์œผ๋ฉด ์œ ์ง€, ๋‹ค๋ฅด๋ฉด ๋‹ค์‹œ ๋ฐ›๊ธฐ! 

• ์บ์‹œ ์ œ์–ด ๋กœ์ง์„ ์„œ๋ฒ„์—์„œ ์™„์ „ํžˆ ๊ด€๋ฆฌ 

• ํด๋ผ์ด์–ธํŠธ๋Š” ๋‹จ์ˆœํžˆ ์ด ๊ฐ’์„ ์„œ๋ฒ„์— ์ œ๊ณต(ํด๋ผ์ด์–ธํŠธ๋Š” ์บ์‹œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ชจ๋ฆ„) 

• ์˜ˆ) ์„œ๋ฒ„๋Š” ๋ฐฐํƒ€ ์˜คํ”ˆ ๊ธฐ๊ฐ„์ธ 3์ผ ๋™์•ˆ ํŒŒ์ผ์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ETag๋ฅผ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ -> ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ ์ฃผ๊ธฐ์— ๋งž์ถ”์–ด ETag ๋ชจ๋‘ ๊ฐฑ์‹ 


๐Ÿ“Œ ๊ฒ€์ฆ ํ—ค๋”์™€ ์กฐ๊ฑด๋ถ€ ์š”์ฒญ ํ—ค๋” ์ •๋ฆฌ

๐Ÿ“ ๊ฒ€์ฆ ํ—ค๋” (Validator)

• ETag: "v1.0", ETag: "asid93jkrh2l" 

• Last-Modified: Thu, 04 Jun 2020 07:19:24 GMT

 

๐Ÿ“ ์กฐ๊ฑด๋ถ€ ์š”์ฒญ ํ—ค๋”

• If-Match, If-None-Match: ETag ๊ฐ’ ์‚ฌ์šฉ 

• If-Modified-Since, If-Unmodified-Since: Last-Modified ๊ฐ’ ์‚ฌ์šฉ