인포메이트 2주차 공유(브라우저)
인포메이트 2주차 공유(브라우저) 모음입니다.
아니 왜 로컬에서는 잘 되는데 사파리는 안되는거지? - 윤해진
Cache-Control, Expires를 빠뜨리면 브라우저에서 무슨 일이 일어날까? - 김하나
브라우저가 숨기는 디버깅 비밀! 이런 트릭들 알고 계셨나요? - 곽승주
아니 왜 로컬에서는 잘 되는데 사파리는 안되는거지? - 윤해진
intro
개발을 할 때 보통 크롬을 사용해 작업을 하게 됩니다. 그때는 아무 문제가 없었던 기능 혹 css가 사파리나 다른 브라우저에서는 깨지는 경우가 생기곤 합니다. 따라서 해당 개념과 연관 지어 크로스 브라우징에 대해 글을 작성해 보았습니다!
크로스 브라우징이란?
- 다양한 브라우저 속에서도 서로 호환이 가능한 상호 호환성을 의미합니다.
어느 한쪽에 최적화되지 않고, 공통 요소를 사용하여 웹 페이지를 제작하는 기법으로 동등한 수준의 정보, 기능 접근에 초점을 맞추는 것입니다.
예를 들어 제가 많이 겪어보았던 것은 css와 관련되어 chrome에서는 정상적인 페이지가 safari에서만 width가 맞춰지지 않아 화면 x축으로 스크롤이 되던 경험이 있습니다.
그 외에도
- 작동하지 않은 HTML5, Javascript 코드가 존재
- 해석하지 못하는 CSS 코드 존재
- 브라우저 버그들이 존재
- 브라우저 자체적인 CSS 스타일
위 경우처럼 같은 코드여도 사용자가 접근하는 브라우저마다 다른 결과물을 보인다는 것은 사용성에 있어 매우 좋지 않은 것이라고 모두 느끼실 겁니다.
왜 일어나는 것일까?
- 이유는 OS가 다르고, 브라우저마다 ‘렌더링 엔진’이 다르기 때문입니다.
이 말은 즉 결국 동일하게 안 만드는 것이 아니라 애초부터 동일하게 만드는 것은 ‘불가능한 일’이라고도 할 수 있겠습니다.
- 렌더링 엔진: 화면에 텍스트와 이미지 등을 그리는 SW. HTML 을 요청하면 요청에 따른 적절한 파싱 하여 화면에 표시합니다.
그렇다면 어떻게 처리하지?
- can i use (웹 사이트) https://caniuse.com/?search=grid 위 페이지는 브라우저마다의 css 사용 및 호환 가능 여부를 알려주는 고마운 페이지입니다. 예로 gird라는 속성의 각 브라우저의 호환 가능 여부를 알아보고 싶을 때 해당 사이트에 검색을 하면 다양한 브라우저에서 해당 속성이 사용 가능한지 보기 쉽게 나타냅니다.
- 모질라 MDN (웹 사이트) https://developer.mozilla.org/ko/ 개발을 하며 정말 많이 들어가 보는 페이지 중 하나일 MDN에서도 브라우저 호환성을 확인할 수 있습니다. 검색한 키워드 내용의 최하단에 브라우저 별 호환 관련 정보가 정리되어 있어 찾고자 하는 속성을 검색 후 아래에서 특이 하게 적용이 안되는 브라우저가 있는지 확인해 볼 수 있습니다.
- CSS 초기화 ‘웹 브라우저'마다 default 값으로 스타일이 적용되어 있습니다. 따라서 브라우저마다의 기본 스타일을 없앰으로 초깃값을을 동일하게 하여 지면을 평평하게 만드는 작업을 통해 이후 개발에 차질이 없게 하는 것으로 크로스 브라우징을 예방할 수 있습니다.
💻브라우저 별 벤더프리픽스 (이런것도 있어요!)
웹 브라우저 공급자가 새로운 실험적인 기능을 제공할 때 이전 버전의 웹 브라우저에 그 사실을 알려주기 위해 사용하는 접두사(prefix)를 의미. ⇒ CSS에 새로운 속성을 추가하기 전 임시적으로 접두어를 사용하는 것.
- 크롬, 사파리 : -webkit-
- 파이어폭스 : moz- (mozila 라는 단체가 파이어폭스를 만들었기 때문에)
- 오페라 : -o-
- 익스플로러 : -ms-
background: red; <!-- gradient 속성을 지원하지 않는 모든 브라우저를 위한 코드 -->
background: -webkit-linear-gradient(red, yellow); <!-- 크롬과 사파리 4.0 이상을 위한 코드 -->
background: -moz-linear-gradient(red, yellow); <!-- 파이어폭스 3.6 이상을 위한 코드 -->
background: -ms-linear-gradient(red, yellow); <!-- 익스플로러 10.0 이상을 위한 코드 -->
background: -o-linear-gradient(red, yellow); <!-- 오페라 10.0 이상을 위한 코드 -->
background: linear-gradient(red, yellow); <!-- CSS 표준 문법 코드 -->
Cache-Control, Expires를 빠뜨리면 브라우저에서 무슨 일이 일어날까? - 김하나
http 캐시를 적극적으로 설정하고 제어함으로써 웹 성능을 높일 수 있다는 사실을 알고 계신가요?
현재 우리 프론트엔드 트랙에서 캐시 설정을 직접 다루지는 않습니다. 그렇지만 앞으로의 웹 성능과 이해를 위해 다양한 생명 주기를 가지는 캐시를 다루는 방법에 대해 아는것은 꼭 필요합니다.
그런데 브라우저 캐시 관련 헤더인 Cache-Control
, Exprires
를 빠뜨리면 무슨 일이 일어날까요? 또한 브라우저 캐시 설정이 왜 중요할까요?
웹 캐시
- 실제 작업을 하며 빌드된 사항이 적용이 안될때
캐시 삭제해라
강한 새로고침 해라
등등의 말을 들은 적이 있을 겁니다.(cc. 최원빈님) 이것들도 브라우저 캐시와 관련된 사항이라고 볼 수 있죠. - 클라이언트는 서버로부터 HTTP 요청을 통해 필요한 리소스 (HTML, CSS, JS, 이미지 등)를 불러옵니다. 네트워크를 통해 이 과정을 수행하는건 느리고 비용이 많이 듭니다.
- 여기서 발생할 수 있는 불필요한 네트워크 재요청을 방지하기 위해 웹 캐싱을 사용합니다.
Cache-Control
Expries
등과 같은 우리가 자주 봐온 헤더는 캐시 동작과 관련된 헤더로, 서버의 비용을 줄이고 클라이언트의 성능을 향상시키는 데 유용하게 사용됩니다.
Cache-Control, Expires 헤더를 기입하지 않은 경우
- 누군가 의도했든 의도하지 않았든
Cache-Control
Expires
헤더 모두 기입하지 않은 경우, 브라우저는 어떻게 동작할까요? - 대표적인 브라우저인 크롬의 캐시 동작을 살펴보기 위해 Chromium의 코드를 확인해보았습니다.
HttpResponseHeaders::GetFreshnessLifetimes(const Time& response_time) const {
FreshnessLifetimes lifetimes;
if (HasHeaderValue("cache-control", "no-cache") ||
HasHeaderValue("cache-control", "no-store") ||
HasHeaderValue("pragma", "no-cache")) {
return lifetimes;
}
...
if ((response_code_ == net::HTTP_OK ||
response_code_ == net::HTTP_NON_AUTHORITATIVE_INFORMATION ||
response_code_ == net::HTTP_PARTIAL_CONTENT) &&
!must_revalidate) {
// TODO(darin): Implement a smarter heuristic.
Time last_modified_value;
if (GetLastModifiedValue(&last_modified_value)) {
// The last-modified value can be a date in the future!
if (last_modified_value <= date_value) {
lifetimes.freshness = (date_value - last_modified_value) / 10; //여기!
return lifetimes;
}
}
}
- Chromium의
http_response_headers.cc
를 살펴보니 freshness(유효성)이(date_value - last_modfied_value) / 10
로 할당되는 것 같습니다. - 이는 Date와 LastModified의 차이값의 10분의 1로 추정하여 유효성(freshness) 계산을 한다는 것입니다. MDN 문서를 보니
heuristic
이라는 동작으로 캐시 헤더를 지정하지 않으면 웹 스팩을 기반으로 대략적으로 캐시 작동을 합니다.