- 클로저란 함수와 함수가 선언된 어휘적 환경의 조합. (MDN 정의)

- 함수가 속한 렉시컬스코프를 기억하여 함수가 렉시컬 스코프 밖에서 실행될 때도 그 스코프에 접근할 수 있게 하는 기능

 

function outer() {
  var a = 2;
  function inner() {
    console.log(a);
  }
  return inner;
}
var func = outer();
func(); // 2

위 예제에서 GC(GarbageCollector)가 outer()의 참조를 없앨 것 같지만 내부함수인 inner()가 해당 스코프의 변수인 a를 참조하고 있기 때문에 없애지 않음

따라서 스코프 외부에서 inner()가 실행되도 해당 스코프를 기억하기 때문에 2를 출력

즉, 여기서 클로저는 inner()가 되며 func에 담겨 밖에서도 실행되고 렉시컬 스코프를 기억

 

클로저로 자바스크립트에는 없는 캡슐화라는 개념을 구현할 수 있고 정보 은닉과 캡슐화가 가져다주는 이점들을 얻을 수 있다.

'Coding' 카테고리의 다른 글

브라우저 렌더링 원리  (0) 2023.05.22
Reflow/Repaint 실행 시점  (0) 2023.05.22
주소창에 URL을 입력하면 일어나는 일  (0) 2023.05.22
호이스팅(hoisting)이란?  (0) 2023.05.22
HTTP & HTTPS ( SSL,TLS )  (2) 2020.06.22

Reflow

- DOM 엘리먼트 추가, 제거, 변경

- CSS 스타일 추가, 제거, 변경

- CSS 스타일 직접 변경 or 클래스 추가로 인한 레이아웃 변경

    - 엘리먼트의 길이를 변경하여 DOM 트리에 있는 다른 노드에 영향을 줄 경우

- CSS3 애니메이션과 트랜지션

    - 애니메이션의 모든 프레임에서 리플로우 발생

- offsetWidth 와 offsetHeight 의 사용

    - offsetWidth 와 offsetHeight 속성을 읽으면, 초기 리플로우가 트리거 되어 수치를 계산

- 유저 행동 or 유저 인터렉션으로 발생

    - hover 효과

    - 필드에 텍스트 입력

    - 창 크기 조정

    - 글꼴 크기 변경

    - 스타일시트 or 글꼴 전환

 

Repaint

- 가시성이 변경되는 순간

    - opacity, background-color, visibility, outline

- Reflow가 실행된 순간 뒤에 실행

'Coding' 카테고리의 다른 글

클로저(Closure)란?  (1) 2023.05.23
브라우저 렌더링 원리  (0) 2023.05.22
주소창에 URL을 입력하면 일어나는 일  (0) 2023.05.22
호이스팅(hoisting)이란?  (0) 2023.05.22
HTTP & HTTPS ( SSL,TLS )  (2) 2020.06.22

- 브라우저가 화면 요소를 렌더링 할 땐 크롬: 블링크(Blink), 사파리: 웹킷(Webkit), 파이어폭스: 게코(Gecko) 등과 같은 렌더링 엔진을 사용

- 렌더링 엔진이 HTML, CSS, Javascript로 렌더링할 때 CRP(Critical Rendering Path, 중요 렌더링 경로) 이라는 프로세스를 사용

 

렌더링의 단계

- HTML 파싱 > DOM(Document Object Model) 트리 구축

- CSS 파싱 > CSSOM(CSS Object Model) 트리 구축

- Javascript 실행 

    - ! HTML 중간에 스크립트가 있을 경우 HTML 파싱 중단 !

- DOM과 CSSOM을 조합하여 렌더트리 구축

- 뷰포트 기반으로 렌더트리의 각 노드가 가지는 정확한 위치와 크기를 계산 : Layout(Reflow) 단계

- 계산한 위치/크기 기반으로 화면을 그림 : Paint 단계

'Coding' 카테고리의 다른 글

클로저(Closure)란?  (1) 2023.05.23
Reflow/Repaint 실행 시점  (0) 2023.05.22
주소창에 URL을 입력하면 일어나는 일  (0) 2023.05.22
호이스팅(hoisting)이란?  (0) 2023.05.22
HTTP & HTTPS ( SSL,TLS )  (2) 2020.06.22
  1. URL 주소 중 도메인 네임 부분을 DNS( Domain Name System) 서버에서 검색
  2. DNS 서버에서 해당 도메인 네임에 해당하는 IP 주소를 찾아 사용자가 입력한 URL 정보와 함께 전달
  3. 브라우저는 HTTP 프로토콜을 사용하여 요청 메세지를 생성하고 HTTP 요청 메세지는 TCP/IP 프로토콜을 사용하여 서버로 전송
  4. 서버는 Response 메세지를 생성하여 다시 브라우저에게 데이터를 전송
  5. 브라우저는 Response를 받아 파싱하여 화면에 렌더링

'Coding' 카테고리의 다른 글

Reflow/Repaint 실행 시점  (0) 2023.05.22
브라우저 렌더링 원리  (0) 2023.05.22
호이스팅(hoisting)이란?  (0) 2023.05.22
HTTP & HTTPS ( SSL,TLS )  (2) 2020.06.22
eslint 자동정렬  (0) 2019.08.09

- 호이스팅이란 "끌어올린다" 라는 뜻

- 선언문이 스코프 내의 최상단으로 끌어올려지는 현상

 


변수 호이스팅

console.log(a);
var a = 2;

- 컴파일러는 Javascript 엔진이 인터프리팅을 하기 전에 컴파일을 하는데 이 때, var a = 2; 를 2개의 구문으로 해석

  • var a
  • a = 2

- var a는 변수 선언문으로 컴파일할 때 처리하고, a = 2는 실행할 때까지 내버려 둠

- 변수 a는 호이스팅 되고 콘솔에는 다음과 같은 결과가 표시됨

undefined;

- var는 선언, 초기화가 동시에 이루어지기 때문에 undefined를 출력
- let,const는 선언단계만 호이스팅 되기 때문에 Reference Error를 출력


함수선언문 호이스팅

func();
function func() {
  console.log('함수 호이스팅');
}

console :

함수 호이스팅

- 함수표현식은 호이스팅 되지 않음

'Coding' 카테고리의 다른 글

브라우저 렌더링 원리  (0) 2023.05.22
주소창에 URL을 입력하면 일어나는 일  (0) 2023.05.22
HTTP & HTTPS ( SSL,TLS )  (2) 2020.06.22
eslint 자동정렬  (0) 2019.08.09
Conway Sequence es6 VanillaJS  (0) 2019.08.06

HTTP & HTTPS

- HTTP HTTPS 둘 다 인터넷에서 사용하는 웹서버와 클라이언트의 인터넷 브라우저 사이에 문자를 전송하기 위한 통신규약으로서, 웹서버와 브라우저 간 암호화 된 연결을 설정하는 표준 보안 기술입니다. 

- 철자도 비슷하듯이 HTTP, HTTPS 둘 다 같은핏줄(HyperText Transfer Protocol)을 이어받은 형제입니다.

 

- 애플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동합니다.

 

 

 

HTTP

 

- HTTP = HyperText Transfer Protocol

 

- 기본 포트 : 80

 

- 구형 통신 규약으로 보안성이 약합니다.

 

- 접속도중 끊기더라도 처음부터 다시 시작할 필요가 없어 시간을 낭비하지 않는 장점이 있습니다.

 

- HTTP는 클라이언트가 요청한 페이지를 암호화되지 않은 상태로 주고 받을 수 있어 HTTP로 만든 홈페이지는 클라이언트와 서버의 네트워크에 침임해 중간에서 정보를 가로챌 수 있는 위험이 있습니다.

 

 

 

HTTPS

 

- HTTPS = HyperText Transfer Protocol over Secure Socket Layer

 

- 신형 통신 규약으로 더 안전하고, HTTP의 상위 고급버전 입니다. 따라서 보안성이 매우 강합니다.

 

- 끝에 붙여진 S는 Secure의 약자로, S가 붙으면 보안이 강화된 것 입니다.

 

- SSSL(Secure Socket Layer)을 의미하는것으로 주고 받는 정보가 암호화 되어 있음을 뜻합니다.

 

- 속도가 HTTP보다 느립니다, 하지만 속도 차이는 사용자로서 느끼지 못할 정도입니다.

 

- HTTPS의 암호화는 ( 클라이언트 = 공개 키) ( 서버 = 서버만이 알 수 있는 개인 키 )를 부여하는 방식입니다.

[ 원리 : 사용자(클라이언트)가 사이트에 접속하게 되면 서버가 공개키를 사용자에게 보내게되고 이를 통해서 사용자의 암호화된 정보를 서버는 개인키로 볼 수 있어 네트워크에 침임한 해커는 아무것도 볼 수 없게 됩니다. ]

 

- 보안상에 장점이 있는 반면 암호화 된 정보를 교환하기 때문에 서버가 과부화에 걸리는 경우가 발생하며, 접속이 끊기게 되면 처음부터 다시 시작해야 하는 불편함이 따릅니다.

 

- HTTPS는 서버를 인증하고 안전하게 데이터 전송을 암호화하여 교환시 변조되지 않도록 보호해줍니다.

 

- 만약 HTTPS가 없다면 사이트에 입력한 모든 데이터(사용자이름, 비밀번호, 신용카드 및 은행정보, 기타 양식 제출 정보)가 암호화되지 않아서 일반 텍스트로 전송되기 때문에 해커가 이를 가로채거나 도청을 하기 쉽습니다. 그러므로 중요한 정보를 입력하기 전에 해당 사이트가 HTTPS로 되어있는지, 보안인증서가 설치된 사이트인지 안정성을 반드시 확인 해야 합니다.

 

 

 

SSL

 

- SSL = Secure Socket Layer

 

- 웹서버와 웹사이트에서 이루어지는 모든 정보전송이 https://로 암호화 프로토콜을 통해 안전하게 전송되게 하는 인증서입니다.

 

- SSL을 사용하게되면 로그인, 회원가입, 예약 등의 개인정보를 입력하더라도 스니핑(sniffing)에 의하여 정보를 도용당할 걱정이 없습니다.

 

- SSL 인증서의 사용목적은 스니핑 방지(Sniffing Prevention) 입니다.

 

- 네트워크를 공동으로 사용하는 PC방, 회사, 학교등에서 간단한 스니핑툴로 인해 개인정보가 누출되기 쉬운데, SSL 인증서를 설치하면 (HTTPS 형식을 사용하면) 모든 정보가 암호화되어 정보가 유출되더라도 안심할 수 있습니다.

 

 

 

TLS

 

- TPS = Transport Layer Security

 

- 인터넷에서의 정보를 암호화해서 송수신하는 프로토콜 입니다.

 

- SSL 3.0(Secure Socket Layer) 프로토콜에서 보다 안전하고, 프로토콜의 스펙을 정확히하고 안정성이 높게 발전한 것입니다.

 

- 국제 인터넷 표준화 기구에서 인증받은 통신 규약 입니다.

 

- 암호화 프로토콜은 보안연결을 제공하여 두 당사자가 사생활 보호와 데이터 무결성을 가지고 서로 통신할 수 있게 해줍니다.

 

 

 

SSL 전체 통신 과정

 

- 암호를 만드는 행위인 암호화를 할 때 사용하는 일종의 비밀번호를 키(key) 라고 합니다.

 

- 키에 따라서 암호화된 결과가 달라지기 때문에 키를 모르면 암호를 푸는 행위인 복호화를 할 수가 없습니다.

 

- 대칭키 : 하나의 키로 데이터를 암호화하고 복호화합니다. 하나의 키로 암복호화를 하기 때문에 해당 키가 노출된다면 보안상 아주 치명적인 문제가 발생합니다. 장점이라고 한다면 암복호화에 드는 비용이 적습니다.

 

- 비대칭키 : 2개의 키(공개키, 비공개키)로 암호화&복호화를 합니다. 즉, 공개키로 데이터를 암호화하면 반드시 비밀키로만 복호화 가능하고 비밀키로 데이터를 암호화하면 공개키로만 복호화할 수 있습니다.

이 방식에 착안해서 두개의 키중 하나를 비공개키(private key, 개인키, 비밀키)로 하고, 나머지를 공개키(public key)로 지정합니다.

비공개키는 자신만이 가지고있고, 공개키를 타인에게 제공합니다. 그렇다면 암호화, 복호화의 주체가 되는 키에 따른 특징은 무엇일까요?

 

1) 암호화 - 공개키 / 복호화 - 비공개키 : 진짜 데이터를 암호화하여 보호하기 위한 목적입니다.

 

2) 암호화 - 비공개키 / 복호화 - 공개키 : 인증을 위한 목적입니다. 즉, 서버에서 비공개키로 데이터를 암호화해서 보냈고 클라이언트에서 공개키로 복호화가 된다면 최소한 해당 서버는 클라이언트 입장에서 신뢰할 수 있다는 인증과정을 거치게 된것입니다.

 

SSL 동작방식 

1.  사용자가 브라우저로 사이트에 접속하면 웹서버는 인증서를 웹브라우저에게 보냅니다. 이 인증서에는 인증기관의 개인키로 암호화된 사이트의 정보와 공개키가 들어있습니다.

2. 브라우저는 이미 가지고 있는 인증기관의 공개키로 웹 서버에서 받은 인증서를 복호화 해서 확인합니다.

3. 브라우저는 실제 데이터의 암호화에 사용 될 대칭키를 생성하고, 인증서에서 꺼낸 웹 서버 측의 공개키로 암호화 해서 웹 서버로 보냅니다.

4. 웹서버는 자신이 가지고 있는 개인키로 브라우저가 보내온 대칭키를 복호화 해서 얻습니다. 이제 이 대칭키로 데이터를 암호화해서 주고 받게 됩니다.

 

 

'Coding' 카테고리의 다른 글

주소창에 URL을 입력하면 일어나는 일  (0) 2023.05.22
호이스팅(hoisting)이란?  (0) 2023.05.22
eslint 자동정렬  (0) 2019.08.09
Conway Sequence es6 VanillaJS  (0) 2019.08.06
javascript 뒤로가기 시 경고창 표시 기능  (0) 2019.03.07

eslint --fix . --ext .js,.vue src

'Coding' 카테고리의 다른 글

호이스팅(hoisting)이란?  (0) 2023.05.22
HTTP & HTTPS ( SSL,TLS )  (2) 2020.06.22
Conway Sequence es6 VanillaJS  (0) 2019.08.06
javascript 뒤로가기 시 경고창 표시 기능  (0) 2019.03.07
최고 권한 부여  (0) 2019.03.05

/*********************************************

* @name fnConwaySequenceInit

* @description Conway Sequence 초기화 처리 함수

**********************************************/

const fnConwaySequenceInit = () => {

 

// 첫번째 숫자가 될 변수 R 초기화

const R = 1;

 

// 출력할 라인번호가 될 숫자 변수 L 초기화

const L = 6;

 

// Conway Sequence를 만드는 함수를 담은 변수 sequence 초기화

const sequence = fnMakeSequence(R, L);

 

// fnMakeSequence 함수로 만들어진 sequence 배열을 문자열로 변환하기 위한 변수 output 초기화

const output = fnPrintSequence(sequence);

 

// 만들어진 output 콘솔에 표시!

console.log(output);

};



/*******************************************************************

* @name fnMakeSequence

* @params seed -> 첫번째 숫자

* @params iteration -> 출력할 라인 숫자

* @description 시작 숫자와 출력할 라인 숫자에 따라 Conway Sequence 생성

********************************************************************/

const fnMakeSequence = (seed, iteration) => {

 

// return 될 시퀀스 값을 저장 할 배열에 첫번째 숫자를 담은 seq변수 초기화

let seq = [seed];

 

// 0 ~ 5까지 반복하여 증가하는 반복문

for (let i = 0; i < iteration - 1; i++) {

 

// 출력할 라인 숫자까지 만들어질 동안의 시퀀스 값들을 저장하기 위한 배열 newSeq 초기화

let newSeq = [];

 

// 현재 index 숫자의 갯수 표시를 위한 변수 k 초기화

let k = 1;

 

// seq 배열의 index 비교를 위한 변수 j 초기화

let j = 1;

 

// 현재 반복이 첫번째 반복인지 검사하기위한 while문

while (j < seq.length) {

 

// seq 배열의 j번째 자리 숫자가 앞자리 숫자와 다르면 if문 실행

if(seq[j] != seq[j-1]) {

 

// newSeq 배열에 k를 push

newSeq.push(k);

 

// newSeq 배열에 seq[j-1]를 push

newSeq.push(seq[j-1]);

 

// k의 값을 1로 초기화한다.

k = 1;

}

 

// seq 배열의 j번째 자리 숫자가 앞자리 숫자와 같으면

else{

 

// k의 값에 1을 더한다.

k++;

}

 

// j의 값에 1을 더한다.

j++;

 

}

 

// newSeq 배열에 k를 push

newSeq.push(k);

 

// newSeq 배열에 seq[j-1]를 push

newSeq.push(seq[j-1]);

 

// 만들어진 시퀀스를 seq변수에 저장

seq = newSeq;

 

}

 

// 완성 된 Conway Sequence return

return seq;

 

};



/***************************************************************************************

* @name fnPrintSequence

* @params seq -> 시퀀스 값을 저장한 배열 seq

* @description fnMakeSequence 함수로 만든 시퀀스 값 담은 배열을 문자열로 변환시키기 위한 함수

****************************************************************************************/

const fnPrintSequence = (seq) => {

 

// 문자열로 변환된 시퀀스 값을 담을 변수 str 초기화

let str = '';

 

// 시퀀스 값을 담은 배열 seq의 갯수만큼 반복

for(var i = 0; i < seq.length; i++) {

 

// str 변수에 seq 배열 값 하나하나를 더한다.

str += seq[i] + ' ';

 

};

 

// str 값에 왼쪽/오른쪽 공백 제거 후 return

return str.trim();

 

};

 

// Conway Sequence init function 실행

fnConwaySequenceInit();

'Coding' 카테고리의 다른 글

HTTP & HTTPS ( SSL,TLS )  (2) 2020.06.22
eslint 자동정렬  (0) 2019.08.09
javascript 뒤로가기 시 경고창 표시 기능  (0) 2019.03.07
최고 권한 부여  (0) 2019.03.05
vanillaJS 부드러운 스크롤  (0) 2019.02.14
/**
* @name fnBackWarning
* @description 뒤로가기 시 변경된 값이 있으면 경고창 표시 기능
*/
function fnBackWarning() {

// 브라우저 세션 히스토리와 상태 변경이 있으면
if (window.history && history.pushState) {

// window load 시
addEventListener('load', function () {

// 가짜 상태변경을 한다
history.pushState(null, null, null);

// 히스토리 엔트리가 변경될 시
addEventListener('popstate', function () {

// document에 textarea태그를 가진 모든 요소를 textarea변수에 담는다.
var textarea = document.getElementsByTagName('textarea'),

// document에 input태그를 가진 모든 요소를 input변수에 담는다.
input = document.getElementsByTagName('input'),
inputCheck = false;

// textarea 갯수만큼 반복
for (var i = 0; i < textarea.length; i++) {

// 현재 textarea요소의 data-edited속성값이 있으면
if (textarea[i].getAttribute('data-edited')) {

// inputCheck를 true로한다.
inputCheck = true;
}
}

// input 갯수만큼 반복
for (var i = 0; i < input.length; i++) {

// 현재 input요소의 data-edited속성값이 있으면
if (input[i].getAttribute('data-edited')) {

// inputCheck를 true로한다.
inputCheck = true;
}
}

// inputCheck가 true면
if (inputCheck) {

// 경고 메세지를 표시하고
var stayOnPage = confirm("변경사항을 저장 하시겠습니까?");

// 취소를 누르면
if (!stayOnPage) {

// 뒤로간다.
history.back()
}

// 확인을 누르면
else {

// 가짜 상태변경을 한다
history.pushState(null, null, null);
}
}

// inputCheck가 false면
else {

// 뒤로간다.
history.back()
}
});
});
}
}

fnBackWarning();


'Coding' 카테고리의 다른 글

eslint 자동정렬  (0) 2019.08.09
Conway Sequence es6 VanillaJS  (0) 2019.08.06
최고 권한 부여  (0) 2019.03.05
vanillaJS 부드러운 스크롤  (0) 2019.02.14
vue.js - v-model의 한글 사용 문제를 v-on을 사용한 해결법  (0) 2019.01.18

sudo chmod -R 777 {경로}

+ Recent posts