쿠키란?

쿠키, 스토리지 비교

 

 

쿠키 사용의 예시

/**
 * 쿠키 세팅
 * @param {string} value 쿠키 저장할 name
 * @param {string | number} days 쿠키 저장 날짜
 * @example
 * this._setCookie('레이어팝업123', 7);
 */
_setCookie(value, days){
  const date = new Date();

  date.setDate(date.getDate() + Number(days));
  document.cookie = this.uniqueName + "=" + escape(value) + "; path=/; expires=" + date.toUTCString() + ";"
}

/**
 * 저장한 쿠키 가져오기
 * @param {string} name 쿠키 이름 
 * @return 쿠키 값
 * @throws 쿠키 값이 없으면 null 리턴
 * @example
 * this._getCookie('레이어팝업123')
 */
_getCookie(name){
  const value = document.cookie.match('(^|;) ?' + name + '=([^;]*)(;|$)');
  return value ? value[2] : null;
}

 

 

평소와 같이 쿠키로 '-일동안 보지않기' 기능을 구현하다가

사파리 브라우저에서 적용이 되지 않는 점을 알게되어 조사해본 결과를 공유합니다.

 

(저는 '30일 동안 보지않기', '앞으로 보지않기' 기능을 구현하였는데, 7일 뒤까지만 만료일 지정이 되길래 당황했습니다.)

 

 

2019년 3월 apple 사파리 브라우저의 쿠키 정책이 변경되었습니다.

변경 사항은...

개인정보, 보안 및 성능의 이슈로 [인증서 없이 저장하는 클라이언트 측 쿠키의 최대 값을 7일로 제한한다..입니다.

 

[보안 및 성능 이슈]

  • 클라이언트 쿠키로 저장한 정보는 도난의 위험이 있다고합니다.

    • XSS(Cross-site Scriptiong) 공격에 취약합니다.

  • 쿠키의 증가는 페이지의 성능 저하에도 영향이 있다고 합니다. 

    • 쿠키는 저장되는 정보가 불확실함의 정도가 높아 효율적인 압축할 수 없다고 합니다.

    • 쿠키는 브라우저 요청이 있을 경우 Request Header에 넣어서 자동으로 서버에 전송합니다. 

  • 쿠키는 최대 저장되는 값이 정해져있기 때문에 (클라이언트 300개, 도메인당 20개) 트래커가 많은 쿠키를 추가하게 될 경우 해당 사이트의 쿠키를 밀어낼 수 있다고합니다.

  • 중요한 정보는 http응답으로 인증 쿠키를 설정하고 보안 및 httpOnly로 표시해야한다고 합니다. 

    • document.cookie는 httpOnly가 될 수 없다고 합니다.

 

[정리]

  • 클라이언트 측 쿠키는 document.cookie를 통해 생성하는 쿠키이며 이 쿠키만 영향이 있습니다.

  • context, iframe에서 생성된 쿠키도 포함된다고 합니다.

  • 세션쿠키는 만료기간이 없으므로 영향을 받지 않습니다. (브라우저 종료 시 정보 손실) 

  • 최대가 7일이고 최대를 넘기지 않는다면 설정된 기간 값으로 유지됩니다.

 

보통 쿠키를 사용할 때에는 보안상 로그인과 같이 중요한 정보를 저장하는데 사용하지 않으며

스토리지와 다르게 서버 공간없이도 사용이 가능했기 때문에 '하루동안 보지않기' 기능같은 곳에서는 대중적으로 사용하고 있었습니다.

 

하지만 앞으로는 사파리 브라우저에 대한 크로스브라우징과 함께 7일 이후는 어떻게 개발을 해야할 지 고려해야할 것 같습니다.

 

참고 :  https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/

 

 

조건부 주석이란?

HTML을 이용해 웹 사이트를 마크업할 때에 크로스 브라우징을 할 경우에 HTML의 주석 태그를 이용하여서 인터넷 익스플로러에 대해 적용하기 위한 특수한 형식의 주석이다.
IE5 에서 처음으로 지원하기 시작하였으며 IE10이상에서는 조건부 주석이 작동하지 않는다.

 

문법

구문 예시

예시

IE8이 아닐 때

DOM 렌더링

 

IE8 일 때

DOM 렌더링

 

크로스 브라우징 이란?

웹 페이지 제작 시에 모든 브라우저에서 깨지지 않고 의도한 대로 올바르게(호환성) 나오게 하는 작업을 말한다.
[HTML, CSS, Javascript 작성 시 W3C의 웹 규격에 맞는 코딩을 함으로써 어느 브라우저, 기기에서 사이트가 의도된 대로 보여지고 작동되는 기법.]

크로스 브라우징 작업이 필요한 원인은 무엇일까?

브라우저 마다 더링 엔진이 다르기 때문이다.

  • 작동되지 않는 HTML5, Javascript 코드가 존재

  • 해석하지 못하는 CSS 코드 존재

  • 브라우저 버그들이 존재

  • 브라우저마다 자체적인 CSS 스타일

*IE를 버전마다 크로스 브라우징하는 이유.
최신 버전으로 자동 업데이트가 되는 브라우저가 많으나 IE는 해당되지 않는다.
IE는 사용자가 직접 업데이트를 진행해야 하며, 윈도우 버전에 따라 최대 버전이 한정되어 있다.

 

랜더링 엔진(or 레이아웃 엔진)

페이지를 랜더링할 때 실질적으로 작업을 하게 되는 엔진이다.
같은 엔진을 사용하면 다른 브라우저여도 비슷하게 출력된다.

[레이아웃 엔진의 종류]트라이던트(Trident)게코(Gecko)웹킷(Webkit)프레스토(Presto)블링크(Blink)듀얼 엔진

트라이던트(Trident)

- IE, 아웃룩 이메일 클라이언트나 윈도우 프로그램의 미니 브라우저등에 사용된다.

마이크로 소프트

게코(Gecko)

- 파이어 폭스, 모질라 재단의 이메일 클라이언트인 선더버드에 사용된다.

모질라

웹킷(Webkit)

- 초기 애플사가 사파리 엔진으로 사용하기 위해 차용했으나 현재는 웹킷 프로젝트로 분리되어 개발되고 있다.
-
크롬에서도 사용되었던 엔진이며 iOS나 안드로이드의 기본 브라우저들이 이 웹킷 엔진을 사용한다.
- 점유율이 높은 엔진이다.

애플사

프레스토(Presto)

- 오페라 15버전부터 더이상 사용하지 않는다.

오페라 소프트웨어 

블링크(Blink)

- 웹킷 엔진을 사용하던 구글이 크롬이 개발, 사용하고 있는 엔진이다. 
- 웹킷에서 줄기를 가져 왔기 때문에 웹킷엔지과 비슷한 모습이 보여진다. 
- 프레스토 엔진을 버린 오페라가 블링크 엔진을 사용하고 있다.

구글

듀얼 엔진

- 국내 이스트소프트의 스윙(Swing) 브라우저를 예로 들면 크롬과 같은면서도 액티브X를 지원하는데, 독자적인 엔진이 아닌 두가지 엔진을 번갈아 사용하는 방식이기 때문에 가능하다. 

- 보통 트라이던트와 웹킷or블링크 엔진을 사용한다.

 

 

 

브라우저 대응 순서, 어떤 브라우저에 초점을 둬야하는가?

타겟이 되는 (가장 점유율이 높은) 브라우저부터 맞추는 것이 좋다.
보통 기준이 되는 %이하인 브라우저는 지원에서 제외하기도 한다. 


점유율 조사 사이트 : http://gs.statcounter.com/
세계 2019/4 ~2020/4

1위 크롬 2위 사파리 3위 파이어폭스 그외 비슷비슷

 

한국 2019/4 ~2020/4

크롬 1위, 2위-3위(엎치락뒤치락) 삼성인터넷, 사파리 4위 IE, 웨일 5위 파이어폭스 그외 비슷비슷

http://gs.statcounter.com/browser-market-share/desktop/south-korea/#monthly-201805-201903

 

확실히 세계랑 한국만 봤을때 다른 부분이 존재한다.

정책이나 타겟을 잘 잡아야한다.

 

크로스 브라우징 작업

1. 도움이 되는 사이트를 이용하여 브라우저에 맞게 작업한다. - 캔아이유즈 https://caniuse.com

2. 초기화 작업 (CSS 초기화 작업) - 브라우저마다 차이가 나는 기본 스타일 값들을 초기화 시킨다.

3. 핵(Hack)

스타일을 줄 때 특수문자를 넣어서 다른브라우저들에서는 인식이 안되지만 IE 특정 버전에서는 인식되도록 하는 방법이다. 이 방법은 추천하지 않는다.

IE8 이상의 브라우저에서 구분해내기가 어려우며 CSS 유지 보수를 어렵게 한다.

div{ 
  color:red; 
  
  /* IE7이하 대응 */ 
  *color:blue 
  
  /* IE6 대응 */ 
  _color:green 
}

4. IE용 주석을 이용한 방법 (Conditional comments)

HTML 문서 내에서 주석을 이용하여 구별한다.

lt (less than) 미만
lte(less than or equal to) 이하
gt(greater than) 초과
gte(greater than or equal to) 이상
<!-- [if IE 7]> 
	<link href="ie7.css" type="text/css" rel="stylesheet"/> 
<![endif]--> 

<!-- [if IE 8]> 
	<p> 이 문구는 IE8이 포함되지 않은 하위 브라우저, 즉 IE7,6에서 보여지게 됩니다.</p> 
<![endif]-->

5. 메타 태그를 이용한 IE모드

<head>
	// ...
    
	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
    
    //...
</head>
    

<head> 요소 안에 넣어두며 IE가 문서를 읽고 랜더링 할 때 원하는 모드로 랜더링을 하게 해준다.
만약 content에 값이 "IE=edge"라면 해당브라우저가 할 수 있는 가장 최신의 모드로 랜더링한다.

 

 

크로스 브라우징 작업, 어느정도 맞춰야하나?

IE 하위버전에서 html5를 사용하려고 라이브러리를 사용하는 것은 성능을 저하시킬수 있다.

 

보통, IE의 버전이 낮을 수록 컴퓨터 성능도 최신이 아닐 가능성이 크다.

그러므로 성능 저하는 더 치명적일 가능성이 크다.
크로스 브라우징의 의미를 정확히 알고 작업해야 한다. (동일성이 아닌 동등성!)

 


 

 

참고 사이트
https://mulder21c.github.io/2019/01/30/what-is-cross-browsing/

 

 

+ Recent posts