Repository: baeharam/Must-Know-About-Frontend Branch: main Commit: 8dee553abd9f Files: 57 Total size: 120.0 KB Directory structure: gitextract_qcdtrx2_/ ├── .github/ │ └── PULL_REQUEST_TEMPLATE.md ├── Notes/ │ ├── css/ │ │ ├── bfc.md │ │ ├── block-inline-inline-block.md │ │ ├── box-model.md │ │ ├── center.md │ │ ├── float-clear.md │ │ ├── grid.md │ │ ├── img-space.md │ │ ├── margin-collapsing.md │ │ ├── reset-normalize.md │ │ └── z-index.md │ ├── frontend/ │ │ ├── bom-dom.md │ │ ├── browser-rendering.md │ │ ├── bundler-transpiler.md │ │ ├── ci-cd.md │ │ ├── csr-ssr.md │ │ ├── css-js-animation.md │ │ └── engine.md │ ├── html/ │ │ ├── data.md │ │ ├── doctype.md │ │ ├── script-tag-type.md │ │ ├── semantic.md │ │ ├── standard-quirks.md │ │ └── web-storage-api.md │ ├── javascript/ │ │ ├── ajax.md │ │ ├── closure.md │ │ ├── es11.md │ │ ├── es6.md │ │ ├── es7-es8.md │ │ ├── es9-es10.md │ │ ├── event-delegation.md │ │ ├── event-loop.md │ │ ├── execution-context.md │ │ ├── hoisting.md │ │ ├── identity-equal.md │ │ ├── iife.md │ │ ├── module.md │ │ ├── native-host.md │ │ ├── new.md │ │ ├── prototype.md │ │ ├── scope.md │ │ ├── stack-heap.md │ │ ├── strict-mode.md │ │ ├── this.md │ │ └── var-let-const.md │ ├── network/ │ │ ├── cdn.md │ │ ├── cookie-session.md │ │ ├── http.md │ │ ├── http1.1-2.md │ │ ├── https.md │ │ ├── rest-api.md │ │ ├── tcp-udp.md │ │ ├── type-url-process.md │ │ └── uri.md │ └── security/ │ ├── sop.md │ └── xss-csrf.md └── README.md ================================================ FILE CONTENTS ================================================ ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## 무엇이 잘못되었나요? ## 어떻게 해결하셨나요? ## 리뷰어들이 주의깊게 봤으면 하는 부분이 있으신가요? ================================================ FILE: Notes/css/bfc.md ================================================ # Block Formatting Context MDN의 정의를 보면, > *BFC는 웹페이지의 블록 레벨 요소를 렌더링하는데 사용되는 CSS의 비주얼 서식 모델 중 하나이다.* 즉, 블록 레벨 요소가 포함되는 **서식모델** 이다.
## 생성 조건 BFC가 생성되기 위해선 다음과 같은 조건 중 하나를 만족해야 한다. * 루트 혹은 이를 포함하는 요소 * float가 none이 아니면서 clear 되지 않은 경우 * position이 absolute / fixed * display가 inline-block / tabel-cell / tabel-caption * overflow가 visible이 아님 * display가 flex / inline-flex 위 조건에 따른 예제를 보면, 아래 요소들은 모두 BFC를 생성한다. ```html
``` ```css .float { float: left; } .position { position: absolute; } .display { display: inline-block; } .overflow { overflow: hidden; } .flex { display: flex; } ```
## 활용 1. **마진겹침 제거하기** ```html

element

element

element

``` ```css div { background-color: blue; } p { margin: 10px 0; background-color: green; } .bfc { overflow: hidden; } .new-bfc { overflow: hidden; } ``` [Codepen](https://codepen.io/BaeHaram/pen/YzXGZBd) `p` 태그 사이에 10px의 마진이 마진겹침으로 인해 20px이 아닌 10px이 되었다. 이 때 새로운 BFC를 생성해서 `p` 를 집어넣으면 마진겹침을 해결할 수 있다. 2. **float된 요소들 포함하기** ```html
``` ```css .container { border: 3px solid red; overflow: hidden; } .float { float: left; width: 500px; height: 300px; background-color: yellow; } ``` [Codepen](https://codepen.io/BaeHaram/pen/oNXZBXJ) 보통 float된 요소를 포함하기 위해선 `.clearfix` 핵을 사용하지만 새로운 BFC를 생성함으로도 해결할 수 있다. 3. **float된 요소를 감싸는 텍스트를 분리하기** ```html

많은 양의 텍스트....

``` ```css .container { border: 3px solid red; overflow: hidden; } .box { float: left; width: 100px; height: 100px; background-color: green; } p { overflow: hidden; } ``` [Codepen](https://codepen.io/BaeHaram/pen/VwLpPvN) `p` 태그로 새로운 BFC를 생성하여 텍스트가 float 된 요소를 감싸지 않도록 하였다.
## 참고 * [Understanding Block Formatting Contexts in CSS](https://www.sitepoint.com/understanding-block-formatting-contexts-in-css/) * [MDN, Block formatting context](https://developer.mozilla.org/ko/docs/Web/Guide/CSS/Block_formatting_context) ================================================ FILE: Notes/css/block-inline-inline-block.md ================================================ # block vs inline vs inline-block | 특징 | block | inline | inline-block | | ---------------------------- | ------------------ | ------------------ | ------------------ | | 상하 마진/패딩 | :white_check_mark: | :x: | :white_check_mark: | | 좌우 마진/패딩 | :white_check_mark: | :white_check_mark: | :white_check_mark: | | 요소 사이 줄바꿈 | :white_check_mark: | :x: | :x: | | 기본너비가 부모너비 | :white_check_mark: | :x: | :x: | | 요소 사이 공백 | :x: | :white_check_mark: | :white_check_mark: | | 너비와 높이 명시했을 때 적용 | :white_check_mark: | :x: | :white_check_mark: | [Codepen](https://codepen.io/BaeHaram/pen/poJaRyK) 을 통해서 확인해보면 위의 특징들을 좀 더 명확하게 알 수 있으니 해보도록 하자.
## 참고 * [Gist, css-display.md](https://gist.github.com/Asheq/1ef5ec77b8e89c2c9da89d2b7a1cf8cb) * [Stackoverflow, CSS display: inline vs inline-block](https://stackoverflow.com/questions/9189810/css-display-inline-vs-inline-block) ================================================ FILE: Notes/css/box-model.md ================================================ # Box Model

문서상의 요소들을 시각적인 목적을 위해서, 모든 요소를 하나의 "직사각형 박스"로 여기는 모델이다. 모든 박스는 아래 영역들을 갖는다. * **컨텐츠 영역(Content Area)** : 글이나 이미지, 비디오 등 요소의 실제 내용을 포함한다. * **안쪽여백 영역(Padding Area)** : 안쪽여백 경계(Padding Edge)가 감싼 영역으로 컨텐츠 영역을 요소의 안쪽 여백까지 포함하는 크기로 확장한다. * **테두리 영역(Border Area)** : 테두리 경계(Border Edge)가 감싼 영역으로, 안쪽여백 영역을 요소의 테두리까지 포함하는 크기로 확장한다. * **바깥여백 영역(Margin Area)** : 바깥여백 경계(Margin Edge)가 감싼 영역으로, 테두리 영역을 확장해 요소와 인근 요소사이의 빈 공간까지 포함하도록 한다.
## box-sizing box-sizing 속성을 사용하면, `width` 와 `height` 이 컨텐츠 영역 기준인지, 테두리 영역 기준인지 정할 수 있다. * `box-sizing: content-box` : 기본값이며 컨텐츠 영역 기준이다. 즉, 안쪽여백 영역부터 포함하지 않는다. * `box-sizing: border-box` : 테두리 영역 기준이며 바깥여백 영역부터 포함하지 않는다.
## 참고 * [MDN, CSS 기본 박스 모델 입문](https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Box_Model/Introduction_to_the_CSS_box_model) * [W3, CSS Box Model Module Level 3](https://www.w3.org/TR/css-box-3/) * [BrainJar, CSS Positioning](http://www.brainjar.com/css/positioning/) ================================================ FILE: Notes/css/center.md ================================================ # 가로/세로 가운데 정렬하기 ## div의 가운데 정렬 ```html
``` 위와 같이 마크업이 되어있다고 했을때 다음 방법들을 사용할 수 있다. ### position과 margin ```css .position-margin { position: absolute; left: 0; right: 0; top: 0; bottom: 0; margin: auto; } ``` 원래 `div` 는 부모의 너비만큼 너비를 갖기 때문에 자신의 너비가 있다 하더라도 보이지 않는 공간이 있다. 이런 특성 때문에 `margin: 0 auto` 와 같이 가로 가운데 정렬을 할 수 있는데, `position: absolute` 를 쓰면 이 공간이 사라지게 된다. 따라서, 해당 공간을 전체로 확장하기 위해서 `left` , `right` , `top` , `bottom` 을 각각 0으로 설정해주었다. 이렇게 되면 보이지 않는 공간이 가로/세로를 전부 차지하게 되고 여기서 `margin: auto` 를 주면 알아서 바깥여백이 만들어지기 때문에 전체적으로 가운데 정렬된다. ### position과 transform ```css .position-transform { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%); } ``` `div` 의 너비와 높이를 모를 때 유용한 기법으로 부모 기준으로 50% 위/왼쪽에서 떨어진다음 자신의 너비/높이의 50%를 다시 역방향으로 오게 하는 방법이다. ### flex ```css .flex { display: flex; justify-content: center; align-items: center; } ``` 부모에게 `display: flex` 를 줘야 해결할 수 있는 제약이 있고 지원하지 않는 브라우저가 있긴 하지만 그래도 상당히 유용하게 쓰인다. **[Codepen](https://codepen.io/BaeHaram/pen/LYVdRmL) 을 통해서 연습해보자.**
## 텍스트 요소의 가운데 정렬 ### 텍스트 - padding ```html
텍스트
``` ```css div { text-align: center; padding: 3em 0; } ``` 부모에 `text-align: center` 를 줘서 자식 요소들의 텍스트를 가로 가운데 정렬 했고 높이를 주지 않고 패딩을 상/하로 줘서 세로 가운데 정렬을 했다. 이 때 패딩의 단위로 `em` 을 사용했는데 이는 현재 엘리먼트의 폰트 크기의 3배를 의미한다. 즉, 폰트 크기가 바뀔 때마다 패딩도 변하기 때문에 유동적으로 세로 가운데 정렬이 이루어지는 방법이다. ### 텍스트 - line-height ```css div { height: 100px; } span { line-height: 100px; } ``` 만약 높이를 명시적으로 준다면, 텍스트 요소에게 동일한 크기의 `line-height` 를 주어서 해결할 수 있다. ### 이미지 ```html
텍스트
``` ```css img { vertical-align: middle; } ``` 이미지의 정렬도 위와 같이 할 수 있는데 한가지 다른 점은, 폰트의 baseline 기준으로 배치가 되기 때문에 이를 middle로 맞춰야 제대로된 정렬이 이루어진다. **[Codepen](https://codepen.io/BaeHaram/pen/oNXqzJo) 을 통해서 연습해보자.**
## 참고 * [빔캠프, div 가로세로 모두 가운데 정렬 css position (유튜브)](https://www.youtube.com/watch?v=vdvLfkn9wp4) * [빔캠프, 너비높이를 알 수 없는 div 가로세로 모두 가운데 정렬 (유튜브)](https://www.youtube.com/watch?v=78-X1JGvCZU) * [빔캠프, CSS 텍스트 요소 가로, 세로 가운데 정렬 (유튜브)](https://www.youtube.com/watch?v=PEYt17TlTQk) * [Stackoverflow, Best way to center a on a page vertically and horizontally?](https://stackoverflow.com/questions/356809/best-way-to-center-a-div-on-a-page-vertically-and-horizontally) ================================================ FILE: Notes/css/float-clear.md ================================================ # float를 해제하는 방법들 float 속성을 자식 엘리먼트에 사용하게 되면 부모 엘리먼트가 자식의 높이를 감지할 수 없기 때문에 이를 반영하기 위한 방법이 필요하다. 다음 코드를 가정으로 한다. ```html
부모
자식
``` ```css .child { float: left; } ```
## 부모 엘리먼트에 `float` 적용 * 자식을 포함할 만큼만 너비로 줄어듦 * 부모가 겹겹이 있을 경우 계속해서 float 시켜야 함 ```css .parent { float: left; } ```
## 부모에 `overflow` 속성 적용 * `overflow: auto` 의 경우, 자식의 너비가 더 크면 스크롤바 생김 * `overflow: hidden` 의 경우, 자식의 너비가 더 크면 잘림 ```css .parent { overflow: hidden; } ```
## 부모가 끝나기 전 빈 엘리먼트로 `clear` 적용 * 의미없는 엘리먼트를 넣기 때문에 권장되지 않음 ```html
...
``` ```css .clearfix { clear: both; height: 0; overflow: hidden; } ```
## 부모에 `display: inline-block` 적용 * 약간의 여백이 생김 * 자식의 너비를 포함할 만큼으로 줄어듦 ```css .parent { display: inline-block; } ```
## 가상요소로 `clear` 적용 * 제일 권장되는 방법 ```css .parent::after { content: ''; display: block; clear: both; } ```
## 참조 * [float를 clear하는 4가지 방법](https://naradesign.github.io/article/float-clearing.html) ================================================ FILE: Notes/css/grid.md ================================================ # 그리드 시스템 그리드 레이아웃을 구현하기 위해 설계한 시스템으로 너비 960px 혹은 1200px 기준으로 정해놓은 시스템들이 있다. 열(Column)의 개수에 따라 12단/16단/24단 그리드라고 부르기도 한다. 그리드 레이아웃을 구현하는 방법은 여러가지가 있으며 여기선 12단 그리드로 진행한다. > float, flexbox, grid의 기본개념과 문법들에 대해 알고있어야 한다.
## Float grid system flexbox나 grid가 나오기 이전에 사용하던 방식으로 float 속성을 사용하여 구현한다. float된 높이를 잡기 위해 clearfix 핵을 사용해야 하며 각 너비를 열/행의 간격에 맞게 계산해주어야 한다. **[Codepen](https://codepen.io/BaeHaram/pen/XWbYpwx) 에서 꼭 직접 해보자!** ```html

Float grid system

``` ```css :root { --gutter: 10px; } .container { width: 500px; border: 3px solid red; padding: 1rem; } .row::after { content: ''; display: block; clear: both; } .row + .row { margin-top: var(--gutter); } .col { height: 100px; background-color: orange; float: left; margin-right: var(--gutter); } .col:last-child { margin-right: 0; } .col-1-12 { width: calc(100%/(12/1) - var(--gutter)*11/12); } .col-2-12 { width: calc(100%/(12/2) - var(--gutter)*10/12); } .col-3-12 { width: calc(100%/(12/3) - var(--gutter)*9/12); } .col-4-12 { width: calc(100%/(12/4) - var(--gutter)*8/12); } .col-5-12 { width: calc(100%/(12/5) - var(--gutter)*7/12); } .col-6-12 { width: calc(100%/(12/6) - var(--gutter)*6/12); } .col-7-12 { width: calc(100%/(12/7) - var(--gutter)*5/12); } .col-8-12 { width: calc(100%/(12/8) - var(--gutter)*4/12); } .col-9-12 { width: calc(100%/(12/9) - var(--gutter)*3/12); } .col-10-12 { width: calc(100%/(12/10) - var(--gutter)*2/12); } .col-11-12 { width: calc(100%/(12/11) - var(--gutter)*1/12); } .col-12-12 { width: calc(100%/(12/12) - var(--gutter)*0/12); } .col:nth-child(even) { background-color: blue; } ``` `row::after` 로 clearfix 핵을 적용하였고 행의 `margin` 으로 수직 간격을, 열의 `margin` 으로 수평 간격을 지정하였다. 또한 12단 그리드이기 때문에 `.col-x-12` 가 뜻하는 것은 12단 중에 x개를 차지하는 너비를 말한다. 간격에 유동적으로 적용하기 위해 간격변수인 `--gutter` 기준으로 계산하였다.
## Flexbox grid system **[Codepen](https://codepen.io/BaeHaram/pen/oNXyZvv) 에서 꼭 직접 해보자!** 대부분 float를 사용한 방식과 동일하되, clearfix 핵을 없애고 flex를 적용한 것이다. ```css /*.row::after { content: ''; display: block; clear: both; }*/ .row { display: flex; } ```
## Grid layout grid system grid를 사용한 경우로, float/flexbox와는 완전히 다르다. 너비를 계산하지도 않고 `row` 나 `column` 을 따로 지정하지 않는다. 단순하게 grid 관련된 속성을 사용해서 열/행의 너비 및 높이와 각 항목의 비율을 지정한다. **[Codepen](https://codepen.io/BaeHaram/pen/JjdZWoQ) 에서 꼭 직접 해보자!** ```html

Grid layout grid system

1
2
3
4
5
6
7
8
``` ```css .container { width: 500px; border: 3px solid red; padding: 1rem; } .grid { display: grid; height: 500px; grid-template-rows: repeat(4,1fr); grid-template-columns: repeat(3,1fr); grid-row-gap: 10px; grid-column-gap: 10px; } .item { background-color: crimson; text-align: center; font-size: 2rem; font-weight: bold; } .item:nth-child(even) { background-color: yellow; } .item-3 { grid-row: 1/3; grid-column-start: 3; } .item-6 { grid-column: 1/4; grid-row: 3/4; } ```
## 참고 * [Sass로 12단 그리드 시스템 만드는 법](https://medium.com/fluosoup/sass로-12단-그리드-시스템-만드는-법-d2c7cf54c36) * [CSS Grid 완벽 가이드](https://heropy.blog/2019/08/17/css-grid/) ================================================ FILE: Notes/css/img-space.md ================================================ # img 아래쪽 공백 제거 ## img의 공백 `` 태그를 사용할 때 기본적으로 아래쪽에 공백이 생긴다. ```html
``` ```css .container { width: 300px; border: 1px solid crimson; } img { max-width: 100%; } ```


## 공백이 생기는 이유 `` 태그는 인라인-레벨 요소이기 때문에 기본적으로 일반 텍스트와 동일하게 baseline 기준으로 정렬이 된다. 이 말은 즉, `vertical-align: baseline` 이 기본값이라는 말이다.

[이미지 출처](https://stackoverflow.com/a/34952703/11789111) 위 그림에서 텍스트가 baseline 기준으로 정렬된 것을 볼 수 있는데 `` 도 마찬가지이다. baseline 기준으로 정렬된 인라인-레벨 요소는 알파벳의 y, j, p, g, q 등과 같은 하강문자(descender)를 위해 아래쪽에 더 공간이 있어야 하기 때문에 `` 의 아래쪽에 공백이 생기는 것이다.
## 해결방법 * `` 에 `display: block` * 블록-레벨 요소로 바꿔서 해결하는 방법인데 이러면 한 줄을 다 차지한다는 단점이 있다. * 컨테이너에 `line-height: 0` * 컨테이너에 포함된 인라인 요소의 `line-height` 를 없애는 방법인데, 그 안에 포함된 모든 텍스트의 `line-height` 에 영향을 주기 때문에 좋은 방법이 아니다. * **`` 에 `vertical-align: middle/top/bottom`** * `vertical-align` 을 바꾸는 방법으로 baseline 의 경우에만 아래쪽 공간이 생기니 기준을 바꿔버리는 것이다. **가장 좋은 방법이다.**
## 참고 * [Image inside div has extra space below the image](https://stackoverflow.com/questions/5804256/image-inside-div-has-extra-space-below-the-image) ================================================ FILE: Notes/css/margin-collapsing.md ================================================ # 마진겹침 현상 마진겹침(Margin-Collpasing)이란 블록 레벨 엘리먼트(Block-level element)에 한해서 발생하는 현상으로, 좌우 방향으로는 적용되지 않고 **오로지 수직방향** 으로 적용된다. 2개의 마진이 겹칠 때 더 큰 마진으로 덮어 씌우는 방식이며 하나의 마진이 음수일 경우 더하는 방식을 취한다.
## 3가지 경우 마진겹침은 블록 레벨 엘리먼트라는 가정하에 3가지 경우에 한해서 발생한다. 1. **인접한 엘리먼트** ```html
``` ```css div { width: 100px; height: 100px; background-color: red; } .element1 { margin-bottom: 20px; } .element2 { margin-top: 40px; } ```

두번째 엘리먼트의 위쪽 마진이 더 크기 때문에 둘 사이의 간격은 40px이 된다. 2. **부모와 처음/마지막 자식 사이에서** ```html
``` ```css div { width: 100px; height: 100px; } .parent { background-color: red; margin-top: 20px; } .child { background-color: blue; margin-top: 20px; } ```

둘의 마진이 같기 때문에 20px이 된다. 이를 해결하기 위해선 **부모에 inline 컨텐츠, border, padding** 을 줘서 경계를 구분시키면 된다. ```css .parent { background-color: red; border: 1px solid red; margin-top: 20px; } ```

3. **빈 엘리먼트** ```html
``` ```css .empty { margin-top: 50px; } .element { width: 100px; height: 100px; background-color: red; margin-top: 100px; } ```

높이가 없는 빈 엘리먼트가 인접해있을 때도 마진겹침이 발생하여 위쪽 마진은 100px이 된다. 이를 해결하기 위해선 **빈 엘리먼트에 height, min-height, padding, border나 inline 컨텐츠** 를 줘서 경계를 구분시키면 된다. ```css .empty { border: 1px solid red; margin-top: 50px; } ```


## 예외 대상 `position: absolute` , `float: left` , `display: flex` 등 다양한 상황에 마진겹침이 발생하지 않지만, 그냥 **새로운 BFC(Block Formatting Context)를 생성하는 조건이 마진겹침을 발생시키지 않는다** 고 알아두면 된다.
## 참고 * [MDN, 마진 상쇄 정복](https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Box_Model/Mastering_margin_collapsing) * [Velog, CSS 마진 상쇄(Margin-collapsing) 원리 완벽 이해](https://velog.io/@raram2/CSS-%EB%A7%88%EC%A7%84-%EC%83%81%EC%87%84Margin-collapsing-%EC%9B%90%EB%A6%AC-%EC%99%84%EB%B2%BD-%EC%9D%B4%ED%95%B4#%EB%A7%88%EC%A7%84-%EC%83%81%EC%87%84-%EA%B7%9C%EC%B9%99-%EC%98%88%EC%99%B8) * [Youtube, [ㅁ] 마진병합 margin collapsing | 코딩가나다 | 빔캠프](https://www.youtube.com/watch?v=c19Mjg-ivxc) * [생활코딩, 마진겹침 현상](https://opentutorials.org/course/2418/13464) ================================================ FILE: Notes/css/reset-normalize.md ================================================ # Reset.css vs Normalize.css 크롬, 사파리, IE 등 각 브라우저마다 HTML 요소의 기본 스타일을 가지고 있다. 따라서, CSS로 스타일링을 적용할 때 이러한 특징이 동일한 스타일 적용을 방해하기 때문에 이를 해결하기 위해서 나온 스타일 초기화 기법들이다.
## Reset.css **모든 브라우저 내장 스타일을 없애는 기법** 으로, 그 어떤 스타일도 없는 상태에서 스타일링을 시작한다. `h1` ~ `h6` , `p` , `em` 등 각 태그에 적용되는 스타일을 모두 없앤다. 가장 유명한 스타일은 Eric Mayer의 Reset CSS이며 이를 [깃헙](https://github.com/shannonmoeller/reset-css) 에서 유지하고 있다. 보통, 초기화를 한 후 각자의 방식에 맞게 변형해서 사용한다.
## Normalize.css **모든 브라우저의 스타일을 동일하게 하는 기법** 으로, 스타일을 없애는 Reset.css와는 다르게 기존 스타일을 유지하되 브라우저들의 다른 스타일을 고치는 방식이다. 가장 유명한 스타일은 necolas의 normalize.css이며 이를 [깃헙](https://github.com/necolas/normalize.css/) 에서 유지하고 있다. 실제 코드의 주석을 보면 각 요소를 스타일링 하는 이유에 대해 설명하고 있다.
## 차이점과 선택 * Reset.css의 경우, 모든 것을 초기화하기 때문에 스타일을 처음부터 적용해 나가는 것이 힘들 수 있고 브라우저의 버그를 고치는 것이 아니기 때문에 각 브라우저마다 다른 버그를 발생시킬 수 있다. 하지만, 아예 초기화를 하는 것이기 때문에 업데이트가 필요없다. * Normalize.css의 경우, 브라우저가 업데이트 되어서 새로운 내장 스타일이 적용될 때마다 각 브라우저의 다른 점을 파악하여 스타일을 업데이트해야 하기 때문에 끊임없는 버전 업데이트가 있어야 최신 스타일을 유지할 수 있다. 하지만, 브라우저의 버그를 고치기 때문에 버그가 발생할 걱정을 덜고 기본 스타일을 어느정도 유지하기 때문에 스타일링에 힘을 덜 들일 수 있다. 둘 다 장단점이 있기 때문에 어떤 것이 더 낫다라고는 할 수 없고, 상황에 맞게 적용해서 사용하면 된다고 생각한다.
## 참고 * [Stackoverflow, CSS reset - What exactly does it do?](https://stackoverflow.com/questions/11578819/css-reset-what-exactly-does-it-do) * [Stackoverflow, What is the difference between Normalize.css and Reset CSS?](https://stackoverflow.com/questions/6887336/what-is-the-difference-between-normalize-css-and-reset-css) * [reset.css 와 Normalize.css](https://sapjil.net/resetcss-normalizecss/) * [About normalize.css](http://nicolasgallagher.com/about-normalize-css/) ================================================ FILE: Notes/css/z-index.md ================================================ # z-index의 동작방식 ## z-index와 쌓임 맥락 z-index를 이해하기 위해선 먼저, 쌓임 맥락(Stacking Context)의 개념을 이해해야 한다. **쌓임 맥락이란, HTML 요소들에 사용자를 바라보는 기준으로 가상의 z축을 생성하여 3차원 개념으로 보는 것** 이다. 따라서, 쌓임 맥락을 형성한다는 것은 자신만의 3차원 공간을 형성하는 것이며 그 요소들의 우선순위를 z-index가 정하게 되는 원리이다. [그림 출처](https://tympanus.net/codrops/css_reference/z-index/) 위 그림을 보면, 각 요소들이 사용자를 바라보는 z축 상에서 z-index에 따라 **"쌓이는"** 것을 볼 수 있다. 바로 이것이 쌓임 맥락의 개념이며 쌓임 맥락을 형성하는 조건은 [꽤 많다.](https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context) 모든 걸 기억하면 좋겠지만 중요한 것들을 기억해두록 하자. * **position이 relative/absolute이면서 z-index가 auto가 아닌 요소** * **position이 fixed/sticky인 요소** * **opacity가 1보다 작은 요소** * **transform이 none이 아닌 요소** 가장 많이 쓰는 속성들을 기준으로 조금만 나열해보면 위와 같은데 이 정도는 암기하도록 하자. 쌓임 맥락은 다음 특징들을 갖는다. * 쌓임 맥락은 **다른 쌓임 맥락을 포함할 수 있다.** * 쌓임 맥락에서 쌓임을 고려하는 것은 **오직 자식 요소들에 대해서** 만이다. 즉, 2개의 쌓임 맥락을 형성하는 요소가 있다고 했을 때, 각각은 독립적인 쌓인 맥락을 갖으며 그 안의 자식 요소들은 부모 안에서의 쌓임만 고려된다는 것이다.
## 우선순위 쌓임 맥락을 형성하는 요소가 아무것도 없다고 하면 다음 우선순위로 쌓이게 된다. [그림 출처](https://tympanus.net/codrops/css_reference/z-index/) 만약, 동일한 성격의 요소라면 마크업 순서로 쌓임이 결정된다. 즉, 아래와 같은 경우, ```html
A
B
C
``` ```css div { position: absolute; } ``` 여기서 쌓임 맥락을 형성하는 것으로 착각할 수도 있는데 `position: absolute` 라고 해도 `z-index: auto` 이면 쌓임 맥락을 형성하지 않는다. 어쨌든 여기선 동일한 성격의 요소들이기 때문에 마크업 순서인 A,B,C 순으로 쌓임이 형성된다. ([Codepen](https://codepen.io/BaeHaram/pen/ExjmvRY) 에서 확인할 수 있다.) 쌓임 맥락을 형성한다면, `z-index` 값을 설정할 수 있는 `position: static` 이 아닌 요소들의 경우는 동일한 마크업 레벨에서, `z-index` 값으로 우선순위를 결정한다. `z-index` 값을 설정할 수 없는 요소라면 마크업 순서로 결정한다. 여기선 `position: static` 이 아니고 `z-index: auto` 가 아닌 요소를 보자. ```html
1
2
3
4
5
6
``` 마크업이 위와 같이 되어 있을 때, `z-index` 에 따라 다음과 같이 쌓인다. [그림출처](https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context) * div1과 div2, div3는 같은 레벨에 있으므로 z-index에 따라 쌓이기 때문에 div2 > div3 > div1 순으로 쌓인다. * div4와 div5, div6은 div3안에 있으므로 **그 안에서** z-index에 따라 쌓인다. * 즉, div3 안의 요소들의 z-index가 div1,div2 보다 커도 영향을 주지 않는다. * 결론적으로, div5 > div6 > div4 순으로 쌓인다.
## 참고 * [CSSReference, z-index](https://tympanus.net/codrops/css_reference/z-index/) * [MDN, Stacking Context](https://developer.mozilla.org/ko/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context) * [MDN, z-index](https://developer.mozilla.org/ko/docs/Web/CSS/z-index) ================================================ FILE: Notes/frontend/bom-dom.md ================================================ # BOM과 DOM ## BOM (Browser Object Model) **브라우저의 창이나 프레임을 프로그래밍적으로 제어할 수 있게 해주는 객체모델** 이다. 이를 통해서 브라우저의 새 창을 열거나 다른 문서로 이동하는 등의 기능을 실행시킬 수 있다. 전역객체로 `window` 가 있으며 하위 객체들로 `location` , `navigator` , `document` , `screen` , `history` 가 포함되어 있다.
## DOM (Document Object Model) **웹페이지를 프로그래밍적으로 제어할 수 있게 해주는 객체모델** 이다. 최상위 인터페이스로 Node가 있으며 이는 아래와 같은 구조로 나타난다. [이미지 출처](https://web.stanford.edu/class/cs98si/slides/the-document-object-model.html) 위의 트리구조를 보면 엘리먼트 뿐만 아니라 텍스트와 주석도 있는 것을 알 수 있는데, 이런 것들까지도 DOM 트리에 포함된다. 실제적인 DOM 트리는 아래와 같이 생성된다. ```html 제목
네이버 ```

[Live DOM Viewer](https://software.hixie.ch/utilities/js/live-dom-viewer/) 를 사용해서 DOM 트리를 구성해 본것으로 엘리먼트 뿐만 아니라 텍스트 노드와 주석 노드까지 포함하고 있다. 이제 이런 DOM을 다루기 위해선 `getElementsById` , `querySelector` , `firstElementChild` 등과 같은 브라우저가 제공하는 DOM API를 사용하면 된다.
## 참고 * [Javascript.info, DOM 트리](https://ko.javascript.info/dom-nodes) * [생활코딩, 웹브라우저와 자바스크립트](https://opentutorials.org/course/1375) * [Stackoverflow, What is the DOM and BOM in JavaScript?](https://stackoverflow.com/questions/4416317/what-is-the-dom-and-bom-in-javascript) ================================================ FILE: Notes/frontend/browser-rendering.md ================================================ # 브라우저의 렌더링 원리 브라우저가 화면에 나타나는 요소를 렌더링 할 때, 웹킷(Webkit)이나 게코(Gecko) 등과 같은 **렌더링 엔진** 을 사용한다. 렌더링 엔진이 HTML, CSS, Javascript로 렌더링할 때 **CRP(Critical Rendering Path)** 라는 프로세스를 사용하며 다음 단계들로 이루어진다. 1. **HTML 파싱 후, DOM(Document Object Model) 트리 구축** 2. **CSS 파싱 후, CSSOM(CSS Object Model) 트리 구축** 3. **Javascript 실행** * 주의! HTML 중간에 스크립트가 있다면 HTML 파싱이 중단된다. 4. **DOM과 CSSOM을 조합하여 렌더트리(Render Tree) 구축** * 주의! `display: none` 속성과 같이 화면에서 보이지도 않고 공간을 차지하지 않는 것은 렌더트리로 구축되지 않는다. 5. **뷰포트 기반으로 렌더트리의 각 노드가 가지는 정확한 위치와 크기 계산 (Layout/Reflow 단계)** 6. **계산한 위치/크기를 기반으로 화면에 그림 (Paint 단계)**
실제로 크롬 개발자 도구를 이용해 다음 코드를 어떻게 렌더링 하는지 살펴보았다. ```html 테스트
``` ```css body { background-color: red; } div { width: 100px; height: 100px; background-color: blue; } ``` ```javascript document.querySelector('div').addEventListener('click', () => { console.log('Click div'); }); ``` 위 로그를 보면 알 수 있는 것처럼 위에서 언급한 CRP가 진행된다. 1. Parse HTML을 통해 HTML 파싱 후, DOM 트리 구축 2. Parse Stylesheet를 통해 CSS 파싱 후, CSSOM 트리 구축 3. Evaluate Script를 통해 Javascript 실행 4. 렌더트리 구축 5. Layout을 통해 뷰포트 기준으로 렌더트리 노드들의 각 크기/위치 계산 6. Paint를 통해 Layout에서 계산한 값들로 각 요소를 화면에 그림
## 참고 * [HTML Critical rendering path의 이해](https://blog.asamaru.net/2017/05/04/understanding-the-critical-rendering-path/) * [Naver, 브라우저는 어떻게 동작하는가?](https://d2.naver.com/helloworld/59361) * [MDN, Critical Rendering Path](https://developer.mozilla.org/en-US/docs/Web/Performance/Critical_rendering_path) * [Google, 렌더링 트리 생성, 레이아웃 및 페인트](https://developers.google.com/web/fundamentals/performance/critical-rendering-path/render-tree-construction) * [Stackoverflow, When does parsing HTML DOM tree happen?](https://stackoverflow.com/questions/34269416/when-does-parsing-html-dom-tree-happen) ================================================ FILE: Notes/frontend/bundler-transpiler.md ================================================ # 모듈 번들러와 트랜스파일러 ## 모듈 번들러 > 모듈의 개념을 모른다면 이 문서의 [모듈시스템](https://github.com/baeharam/Must-Know-About-Frontend/blob/master/Notes/javascript/module.md) 을 읽고오자. 현대의 프론트엔드 개발은 모듈단위로 파일을 엮어서 개발하는 방식이다. 즉, 모듈은 서로 의존성을 띄고 있는데 이런 점에서 다음과 같은 문제들이 생긴다. * 수많은 모듈들의 순서를 어떻게 처리할 것인가? (의존성 처리) * 모듈이 많아질수록 HTTP 요청이 많아질텐데 이로 인한 오버헤드는 어떻게 해결할 것인가? * ES6+ 스펙의 코드를 어떻게 처리할 것인가? 위 문제들을 해결하기 위해 등장한 것이 **모듈 번들러(Module Bundler)로 각각의 모듈 의존성을 해결하여 하나의 자바스크립트 파일로 만드는 도구** 이다. 이미지 압축, 최소화(Minification) 등의 여러가지 기능들도 제공하며 유명한 번들러로는 Webpack, Parcel, Rollup 등이 있다.
## 트랜스파일러 트랜스파일링(Transpiling)이란 특**정 언어로 작성된 코드를 비슷한 다른 언어로 변환시키는 행위** 를 말하며 이를 해주는 것이 트랜스파일러(Transpiler)이다. 트랜스파일러가 필요한 이유는 모든 브라우저가 ES6+의 기능을 제공하지 않기 때문에 이를 ES5 코드로 변환시키는 과정이 필요하다. 트랜스파일러는 이 작업을 수행해준다. 사실 ES6+의 기능 뿐만 아니라 리액트의 JSX를 자바스크립트 코드로 변환시킨다거나 타입스크립트를 자바스크립트로 변환시키는 등의 역할도 트랜스파일러의 기능 중에 하나이다. ES6+나 JSX를 변환시키는 트랜스파일러로는 바벨(Babel)이 있으며 타입스크립트를 변환시키는 도구로는 타입스크립트 트랜스파일러가 있다. 보통 프론트엔드 프레임워크 및 라이브러리를 사용해서 개발할 때 모듈 번들러에 트랜스파일러를 추가해서 사용하는 방식을 사용한다.
## 참고 * [What is module bundler and how does it work?](https://dev.to/tanhauhau/what-is-module-bundler-and-how-does-it-work-3gp2) * [트랜스파일이란?](https://ooz.co.kr/416) ================================================ FILE: Notes/frontend/ci-cd.md ================================================ # CI와 CD ## CI (Continuous Integration, 지속적 통합) CI는 빌드와 테스트를 자동화해서 공유 저장소에 병합시키는 프로세스를 뜻한다. git과 같은 버전관리 시스템을 사용할 때 여러명의 개발자가 하나의 공유 저장소를 사용하는 경우가 많다. 이렇게 되면 새로운 코드의 변경 사항이 저장소에 통합되지 않을 경우 서로 충돌할 수 있다. 따라서 빌드/테스트 자동화부터 코드의 일관성(Consistency)을 제공하기 때문에 지속적으로 통합한다는 용어를 사용하는 것이다.
## CD (Continuous Delivery/Deploy, 지속적 전달/배포) CD는 CI의 빌드/테스트를 통해서 정상적으로 수행됨을 확인하면 이는 배포를 수동으로 하느냐 자동으로 하느냐에 따라 2가지로 나뉜다. * **지속적 전달** : 프로덕션 배포를 위한 상태가 되고 배포 자체는 수동으로 실행한다. * 개발팀과 비즈니스팀간의 커뮤니케이션 부족 문제를 해결한다. * **지속적 배포** : 프로덕션까지 자동으로 배포한다. * 어플리케이션의 제공 속도를 증가시킨다.
CI/CD의 대표적인 서비스로 Jenkins, Travis CI, Circle CI 등이 있으며 이를 다이어그램으로 보면 아래와 같다. [이미지 출처](https://aws.amazon.com/ko/devops/continuous-integration/)
## 참고 * [AWS, 지속적 통합이란 무엇입니까?](https://aws.amazon.com/ko/devops/continuous-integration/) * [Red Hat, CI/CD(지속적 통합/지속적 제공): 개념, 방법, 장점, 구현 과정](https://www.redhat.com/ko/topics/devops/what-is-ci-cd) * [개발자노트님, CI(Continuous Integration), CD(Continuous Delivery/Deployment)에 대해 알아보자.](https://jhleed.tistory.com/130) ================================================ FILE: Notes/frontend/csr-ssr.md ================================================ # CSR(Client Side Rendering)과 SSR(Server Side Rendering) ## SPA와 MPA * **SPA (Single Page Application)** 하나의 HTML 파일을 기반으로 자바스크립트를 이용해 동적으로 화면의 컨텐츠를 바꾸는 방식의 웹 어플리케이션이다. * **MPA (Multiple Page Application)** 사용자가 페이지를 요청할 때마다, 웹 서버가 요청한 UI와 필요한 데이터를 HTML로 파싱해서 보여주는 방식의 웹 어플리케이션이다. 전통적인 방식을 이용한다면, SPA가 사용하는 렌더링 방식은 CSR이고, MPA가 사용하는 렌더링 방식은 SSR이다. 각 방식의 동작방식과 장단점을 알아보고, 전통적인 방식을 벗어나, SPA에서도 적절히 SSR을 구현했을 때의 장점과 그 이유를 알아보자.
## CSR [이미지 출처](https://medium.com/@adamzerner/client-side-rendering-vs-server-side-rendering-a32d2cf3bfcc) CSR에선 브라우저가 서버에 HTML과 JS 파일을 요청한 후 로드되면 사용자의 상호작용에 따라 JS를 이용해서 동적으로 렌더링을 시킨다. ### :+1: 장점 * 첫 로딩만 기다리면, 동적으로 빠르게 렌더링이 되기 때문에 사용자 경험(UX)이 좋다. * 서버에게 요청하는 횟수가 훨씬 적기 때문에 서버의 부담이 덜하다. ### :-1: 단점 * 모든 스크립트 파일이 로드될 때까지 기다려야 한다. * 리소스를 청크(Chunk) 단위로 묶어서 요청할 때만 다운받게 하는 방식으로 완화시킬 수 있지만 완벽히 해결할 수는 없다. * 검색엔진의 검색 봇이 크롤링을 하는데 어려움을 겪기 때문에 검색엔진 최적화(Search Engine Optimization)의 문제가 있다. * 구글 봇의 경우는 JS를 지원하지만, 다른 검색엔진의 경우 그렇지 않기 때문에 문제가 된다.
## SSR [이미지 출처](https://medium.com/@adamzerner/client-side-rendering-vs-server-side-rendering-a32d2cf3bfcc) SSR에선 브라우저가 페이지를 요청할 때마다 해당 페이지에 관련된 HTML, CSS, JS 파일 및 데이터를 받아와서 렌더링을 시킨다. ### :+1: 장점 * 초기 로딩 속도가 빠르기 때문에 사용자가 컨텐츠를 빨리 볼 수 있다. * JS를 이용한 렌더링이 아니기 때문에 검색엔진 최적화가 가능하다. ### :-1: 단점 * 매번 페이지를 요청할 때마다 새로고침 되기 때문에 사용자 경험이 SPA에 비해서 좋지 않다. * 서버에 매번 요청을 하기 때문에 서버의 부하가 커진다.
## 참고 * [Client-Side Rendering versus Server-Side Rendering!](https://altalogy.com/blog/client-side-rendering-vs-server-side-rendering/) * [What are Single Page Applications(SPA)?](https://dev.to/kendyl93/what-are-single-page-applications-spa-32bh) * [The Benefits of Server Side Rendering Over Client Side Rendering](https://medium.com/walmartlabs/the-benefits-of-server-side-rendering-over-client-side-rendering-5d07ff2cefe8) * [싱글 페이지 어플리케이션에서의 검색 엔진 최적화 (SEO)](https://funnygangstar.tistory.com/entry/싱글-페이지-어플리케이션에서의-검색-엔진-최적화-SEO) * [Google I/O 2019: Day 3 후기](https://hyunseob.github.io/2019/05/26/google-io-2019-day-3/) * [[주니어탈출기] 서버사이드렌더링(SSR) & 클라이언트사이드렌더링(CSR)](https://velog.io/@zansol/확인하기-서버사이드렌더링SSR-클라이언트사이드렌더링CSR) * [SPA 단점에 대한 단상](https://m.mkexdev.net/374) * [CSR vs SSR](https://medium.com/@adamzerner/client-side-rendering-vs-server-side-rendering-a32d2cf3bfcc) ================================================ FILE: Notes/frontend/css-js-animation.md ================================================ # CSS 애니메이션 vs JS 애니메이션 웹사이트에 애니메이션 효과를 부여할 때 CSS의 `transition` / `animation` 속성을 사용할 수 있고 JS의 `setInterval()` / `requestAnimationFrame()` 을 사용할 수 있다. 하지만 각각을 사용할 때의 특징이 다르고 장단점이 있기 때문에 어떤 차이가 있는지 알아두는 것이 좋다. 기술면접에도 나온적이 있다.
## CSS 애니메이션 일반적으로, 마우스를 올렸을 때 혹은 메뉴 버튼의 전환과 같은 간단하게 처리하는 애니메이션의 경우 CSS로 처리한다. 예를 들어, 200 크기의 정사각형을 왼쪽 위에서 오른쪽 아래로 350px 움직이게 하는 애니메이션을 구현한다고 하면, `transform` 의 `translate` 를 사용해서 구현할 수 있다. 하지만 이를 JS로 구현하기 위해선 `setInterval` 을 통해서 계속해서 `style.top` 과 `style.left` 속성을 변화시켜줘야 한다. 이렇게 되면 이 속성은 브라우저의 렌더링 과정에서 reflow(layout) 단계를 발생시키기 때문에 애니메이션이 부자연스럽게 끊기는 듯한 느낌을 받게 된다. 이런 점에서 바닐라 JS로 애니메이션을 구현하는 것보다 CSS로 구현하는 것이 좋다고 할 수 있다. 이외에도 다양한 장점들이 있으며 정리하자면 다음과 같다. * 반응형으로 애니메이션을 구현하기에 유용한데, 미디어 쿼리로 애니메이션을 적용하면 된다. * 외부 라이브러리를 필요로 하지 않는다. * CSS 자체가 선언형(declarative)이기 때문에 어떤 요소가 애니메이션을 가져야 한다는 직관적인 표현이 가능하다. * 메인 쓰레드가 아닌 별도의 컴포지터 쓰레드(Compositor Thread)에서 그려지기 때문에 메인 쓰레드에서 작업하는 JS보다 효율적이다.
## JS 애니메이션 CSS로 처리하기에는 훨씬 복잡하고 무거운 애니메이션 작업들을 효율적이고, 세밀하게 다루기 위해 사용한다. 바닐라 자바스크립트로 구현할 경우 위에서 살펴본 바와 같이 계속해서 요소의 위치를 재계산하기 때문에 비효율적이며 사용자 눈에 가장 부드러운 60fps가 유지되지 않는다. 이때문에 RAF(RequestAnimationFrame) API가 등장했고 구현방식은 동일하지만 60fps를 보장할 수 있게 되었다. 이외에도 외부 라이브러리인 [Velocity.js](http://velocityjs.org/) 와 [GSAP](https://greensock.com/gsap/) 같은 라이브러리를 통해서 성능 좋은 애니메이션을 구현할 수 있다. 최근에 Web Animations API가 나오기도 했는데 현재(2020년 4월 28일) 기준으로 지원하는 브라우저가 현저히 적기 때문에 아직까진 기존의 방법들이 더 높은 생산성을 가진다고 할 수 있다. 보통 복잡한 애니메이션을 구현하려고 하면 외부 라이브러리를 사용할텐데 이것이 CSS에 비해 가지는 장점은 다음과 같다. * 요소의 스타일이 변하는 순간마다 제어할 수 있기 때문에 애니메이션의 세밀한 구성이 가능해진다. * GPU를 통한 하드웨어 가속을 제어할 수 있다. 이는 CSS의 특정 속성으로 인한 가속을 막아주는데, 하드웨어 가속이 모바일에서 성능저하를 발생시킬 수 있기 때문에 이런 면에선 좋다. * 브라우저 호환성 측면에서 `transition` / `animation` 속성보다 뛰어나다.
## 참고 * [Naver D2, 최신 브라우저의 내부 살펴보기 3 - 렌더러 프로세스의 내부 동작](https://d2.naver.com/helloworld/5237120) * [애니메이션 성능을 높이는 방법](http://sculove.github.io/blog/2013/12/05/animation-for-performance/) * [Julian Shapiro, CSS vs. JS Animation: Which is Faster?](https://davidwalsh.name/css-js-animation) * [손찬욱님, Web Animation API 프레젠테이션](https://sculove.github.io/slides/webAnimation/#/) ================================================ FILE: Notes/frontend/engine.md ================================================ # 자바스크립트 엔진이 코드를 실행하는 과정 자바스크립트를 실행하기 위해선 자바스크립트 엔진이 필요하고 웹 브라우저는 자바스크립트 엔진을 내장하고 있다. 브라우저마다 엔진의 종류가 다르지만 코드를 실행하는 방식은 비슷하기 때문에 보통 어떻게 실행하는지 알아두는 것이 좋다. (V8, SpiderMonkey, Javascript core 등의 구현이 각각 다르다) [이미지 출처](https://mathiasbynens.be/notes/shapes-ics) * 소스코드를 만나면 파싱하여 **AST(Abstract Syntax Tree)** 로 변환한다. * **인터프리터(Interpreter)** 는 AST를 기반으로 **바이트코드(Bytecode)를 생성** 한다. * 인터프리터가 바이트코드를 실행할 때, 자주 사용되는 함수 및 타입 정보 등이 있는 **프로파일링 데이터(Profiling data)** 와 같이 **최적화 컴파일러(Optimizing compiler)** 에게 보낸다. * 최적화 컴파일러는 프로파일링 데이터를 기반으로 **최적화된 코드(Optimized code)를 생성** 한다. * 하지만, 프로파일링 데이터 중에 **잘못된 부분이 있다면 최적화 해제(Deoptimize)** 를 하고 다시 바이트코드를 실행해서 이전 동작을 반복한다.
## 참고 * [JavaScript engine fundamentals: Shapes and Inline Caches](https://mathiasbynens.be/notes/shapes-ics) * [JavaScript 엔진 톺아보기 (1)](https://velog.io/@godori/JavaScript-engine-1) ================================================ FILE: Notes/html/data.md ================================================ # data- 속성 **DOM에 데이터를 저장할 수 있는 사용자 정의 데이터 속성** 으로 `data-` 다음 오는 값이 데이터가 된다. 이 속성은 사용하고자 하는 용도에 적합한 속성이나 요소가 없을 때 사용하며 해당 웹페이지가 **독자적으로 사용하는 값** 이다. 즉, 웹페이지와 독립적인 소프트웨어가 이 속성을 사용해서는 안된다. 예를 들어, 음악 사이트에서 앨범 트랙의 음악을 리스트 형식으로 나타내는데 그걸 시간 순으로 정렬하기 위해서 `data-` 속성으로 음악 시간을 삽입한다고 하자. ```html
  1. 빨간맛
  2. ...
``` 만약 이 음악 사이트와 전혀 상관이 없는 외부에서 음악 시간을 알아내기 위해 사용한다면 목적에 부합하지 않는 것이다. 따라서, `data-` 속성은 해당 사이트만의 자체 스크립트를 위한 속성이라고 할 수 있다.
## 참고 * [W3, Custom Data Attribute](https://www.w3.org/TR/2011/WD-html5-20110525/elements.html#custom-data-attribute) * [프론트엔드 인터뷰 핸드북, `data-` 속성은 무엇에 좋은가요?](https://www.frontendinterviewhandbook.com/kr/html-questions/#data-%EC%86%8D%EC%84%B1%EC%9D%80-%EB%AC%B4%EC%97%87%EC%97%90-%EC%A2%8B%EC%9D%80%EA%B0%80%EC%9A%94) ================================================ FILE: Notes/html/doctype.md ================================================ # DOCTYPE Document Type의 약자로, **HTML이 어떤 버전으로 작성되었는지 미리 선언하여 웹브라우저가 내용을 올바로 표시할 수 있도록 해주는 것** 이다. `` 으로 선언하는데 이걸 해주지 않으면 **호환 모드(quirks mode)** 로 동작한다. 호환 모드의 경우 각 브라우저마다 문서를 나타내는 방식이 다르기 때문에 크로스 브라우징 이슈가 훨씬 심해지게 된다. ## DTD(Document Type Definition) DTD(Document Type Definition)란 문서 형식을 정의해놓은 것으로 DOCTYPE을 명시할 때 사용한다. 즉, HTML 문서가 어떤 문서 형식을 따르는지 DOCTYPE에서 DTD를 지정하는 것이다. 예시로 아래와 같은 것들이 있고 [W3C Recommended list of Doctype declarations](https://www.w3.org/QA/2002/04/valid-dtd-list.html) 에서 더욱 자세하게 확인 가능하다. * XHTML 1.1 * XHTML 1.0 * Strict DTD * Transitional DTD * Frameset DTD * HTML 4.01 * Strict DTD * Transitional DTD * Frameset DTD * HTML 5 현 시점에선, HTML 5의 DTD로 DOCTYPE을 명시하는 것이 제일 바람직하다. ```html ```
## 참고 * [What is DOCTYPE?](https://stackoverflow.com/questions/414891/what-is-doctype) * [비표준 모드 quirks mode, 표준 모드 standards mode 차이와 DOCTYPE](https://aboooks.tistory.com/169) * [DOCTYPE(문서형 정의) 선언](https://webdir.tistory.com/40) * [What is difference between XHTML and HTML?](https://stackoverflow.com/questions/4153403/what-is-difference-between-xhtml-and-html) ================================================ FILE: Notes/html/script-tag-type.md ================================================ # script, script async, script defer * ` ``` `require.js` 파일을 받아서 ` ``` 하지만 JSON 데이터의 포맷이 ```json { name: 'john', age: 19 } ``` 위와 같이 생겼기 때문에 다음과 같이 삽입된다. ```html ``` 이는 자바스크립트의 문법에 맞지 않고 애초에 요청을 한 이유가 데이터를 가공하기 위함이기 때문에 이걸 가공하는 콜백함수를 넘기는 방식이 바로 JSONP이다. 즉, 받은 JSON 데이터를 파라미터로 콜백함수에 넘겨서 실행하는 방식이다. ```html ``` 위와 같이 넘기며, 결국 태그에는 아래와 같이 나타난다. ```html ``` 최신 브라우저에서는 거의 사용 안하고 오래된 브라우저에서 사용하는데 보안문제가 있어서 CORS를 권장한다.
## 참고 * [document.domain이 하는 역할이 뭔가요](https://oybso.tistory.com/entry/documentdomain이-하는-역할이-뭔가요) * [Velog, CORS: Real examples](https://velog.io/@leejh3224/CORS-Real-examples-8yjnloovl5) * [Velog, CORS에 대한 간단한 고찰](https://velog.io/@wlsdud2194/cors) * [Stackoverflow, Ways to circumvent the same-origin policy](https://stackoverflow.com/questions/3076414/ways-to-circumvent-the-same-origin-policy) * [Stackoverflow, Why doesn't setting document.domain work to allow AJAX requests to a parent domain?](https://stackoverflow.com/questions/15563611/why-doesnt-setting-document-domain-work-to-allow-ajax-requests-to-a-parent-doma) * [Stackoverflow, What is JSONP, and why was it created?](https://stackoverflow.com/questions/2067472/what-is-jsonp-and-why-was-it-created) * [위키백과, 동일-출처 정책](https://ko.wikipedia.org/wiki/동일-출처_정책) * [MDN, 교차 출처 리소스 공유 (CORS)](https://developer.mozilla.org/ko/docs/Web/HTTP/CORS) ================================================ FILE: Notes/security/xss-csrf.md ================================================ # XSS와 CSRF ## XSS(Cross Site Scripting, 사이트간 스크립팅) **웹사이트 관리자가 아닌 사람이 웹사이트에 악성 스크립트를 삽입할 수 있는 취약점을 이용한 공격기법이다.** 사용자로부터 받은 입력을 제대로 검증하지 않을 때 나타나며 사용자의 정보를 탈취하거나 비정상적인 기능을 실행할 수 있다. * **저장 XSS** : 웹사이트에 취약점이 있는 웹 서버에 스크립트를 저장시켜서 해당 웹사이트를 요청하는 사용자로 하여금 스크립트를 실행하게 하는 기법이다. * **반사 XSS** : 검색을 사용할 때 결과가 없으면 브라우저에서 입력한 값을 문서에 포함하여 응답하는데 이를 사용하여 스크립트를 실행하는 기법으로 악성 URL을 배포하여 클릭하도록 유도하는 방법을 사용한다. * **DOM 기반 XSS** : 공격 스크립트가 DOM 생성의 일부로 실행되면서 공격하는 기법으로 반사 XSS와 마찬가지로 악성 URL을 배포하여 클릭하도록 유도한다. XSS 를 사용해서 사용자의 쿠키 정보 및 세션 ID를 획득할 수 있으며 시스템 관리자 권한을 획득할 수도 있다. 대응방안은 아래와 같다. * **입/출력 값 검증 및 무효화** : 스크립트를 실행할 때는 기본적으로 `