[DAY-2] JS ์ฃผ์ ๋ฌธ๋ฒ(2)
๐ ํท๊ฐ๋ ธ๋ & ๋ชฐ๋๋ ๋ถ๋ถ๋ค๋ง ์ ๋ฆฌํ๋ ๋๋ง์ TIL
๐ฏ ๋ชจ๋ ๊ฐ์ ๋ด์ฉ์ ์ ์ง ์์์!
์ค๋์ ์๊ฐ์?
๊ณต๋ถ๋์ด ์ด์ ๋ณด๋ค 5๋ฐฐ๋ ๋์์ต๋๋ค.
๋ชจ๋ฅด๋ ๋ด์ฉ ํํฐ๋ผ์ ๊ณ์ ๋ฐ๋ณต ์ฌ์ํ์ต๋๋ค.. (์๋ จ..
๊ทผ๋ฐ ๋๋ฌด ์ฌ๋ฐ์ด์ ํ๋ก ํธ ์ต๊ณ ์ผ..์ด์ฌํ ํด์ผ์ง!
๊ธฐ์กด์ ๊ณต๋ถํ๋ CS ๋คํธ์ํฌ ๋ถ์ผ๋ ๊ฒน์น๋ ๋ถ๋ถ์ด ๋ง์์ ์ด๋ฐ์๋ ์์ํ๋๋ฐ
๋ค๋ก ๊ฐ์๋ก ๋จธ๋ฆฌ ์ธ๋งค๊ณ ์๋ ์ ๋ฅผ ๋ฐ๊ฒฌํ ์ ์์์ต๋๋ค..
์์ ๊ธด ์ ๋ฆฌ ๊ธ์ด์ง๋ง, ์ฝ๊ณ ์๋ชป๋ ๋ถ๋ถ์ด ์์ ์ (๋๋ ์คํ๊ฐ ์์ ์)
๋๊ธ๋ก ๋ง๊ตฌ๋ง๊ตฌ ์๋ ค์ฃผ์ธ์ ๐ซ
[1] ๋คํธ์ํฌ ๊ธฐ์ด
๋ธ๋ผ์ฐ์ ์ URL์ ์ ๋ ฅํ๋ฉด?
- URL์ ํด์ํฉ๋๋ค.
- DNS(Domain Name System) ์กฐํ๋ก ๋๋ฉ์ธ โ IP์ฃผ์ ๋ณํ
www.jiyoung.do
์์ ๋๋ฉ์ธ์jiyoung.do
- ์ฐพ์ IP๊ฐ ํ ๋น๋ ์๋ฒ๊ฐ ์กด์ฌํ๋ ๋์ญ์ผ๋ก ์ด๋
- ARP(Address Resolution Protocol)๋ฅผ ์ด์ฉํ์ฌ IP(๋
ผ๋ฆฌ ์ฃผ์) โ MAC ์ฃผ์(๋ฌผ๋ฆฌ ์ฃผ์) ๋ณํ
- ํด๋น IP๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ธฐ๊ธฐ๊ฐ ๊ณ ์ ํ MAC ์ฃผ์ ๋ฐํ
- MAC ์ฃผ์๋ก ๊ธฐ๊ธฐ๊ฐ ์ค์ ๋ก ์์นํ ๊ณณ์ ์ ์ ์๋ค.
- TCP ํต์ ์ ์ํด Socket ์ด๊ธฐ
- 3 Way handshake๋ก ์ฐ๊ฒฐ ์์ฒญ
- HTTP ํ๋กํ ์ฝ๋ก ๋ค์ด์จ ํจํท ์ฝ๊ณ ์ฒ๋ฆฌ โ ์๋ฒ์์ ์ ์ ํ ์๋ต ๋ฐํ
- ๋ฐ์ HTML ๋ ๋๋ง
- HTML ์ฝ์ด DOM Tree โ Render Tree โ Paint ๊ณผ์
๐ ์ด์ ์ ๋ฆฌ ๊ธ โ
TCP ํ๋กํ ์ฝ์ด๋? https://jungjjeong.github.io/cs/network/Network04/
๋ธ๋ผ์ฐ์ ์ ์๋ ์๋ฆฌ https://jungjjeong.github.io/cs/web/frontend/Browser/
[1-1] http ? https?
http(HyperText Transfer Protocol)๋ ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ์์ฒญ๊ณผ ์๋ต์ ์ฃผ๊ณ ๋ฐ๋ ํ๋กํ ์ฝ๋ก,
ํํ ์น ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ์
๋ ฅํ๋ ์น ์ฃผ์์ธ URL์ ํตํด ์์ฒญ๊ณผ ์๋ต์ด ์ด๋ฃจ์ด์ง๋๋ค.
๊ทธ๋ ๋ค๋ฉด https๋ ๋ฌด์์ผ๊น์?
์ฐ์ https์ http๋ ๋ ๋ค ์๋ฒ์ ํด๋ผ์ด์ธํธ ์ฌ์ด์ ์์ฒญ, ์๋ต์ ์ฃผ๊ณ ๋ฐ๋ ํ๋กํ ์ฝ์ด๋ผ๋ ๊ฒ์ ๊ฐ์ต๋๋ค.
ํ์ง๋ง, http๋ ์ํธํ๋ฅผ ์ง์ํ์ง ์๊ธฐ ๋๋ฌธ์, ์ 3์๊ฐ ์ค์ํ ์ ๋ณด๋ฅผ ์กฐํํ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
์ด๋ฅผ ๋ณด์ํ๊ธฐ ์ํด ๋์จ ๊ฒ์ด ๋ฐ๋ก https์ ๋๋ค!
https(HyperText Transfer Protocol Secure)๋ ๊ธฐ์กด์ http์ ๋ฐ์ดํฐ ์ํธํ๊ฐ ์ถ๊ฐ๋ ํ๋กํ ์ฝ์ ๋๋ค.
80๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ http์ ๋ค๋ฅด๊ฒ, https๋ 443๋ฒ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ์ํธํ๋ฅผ ์ง์ํฉ๋๋ค.
์ํธํ ๋ฐฉ์์๋ ๋์นญํค ์ํธํ, ๋น๋์นญํค ์ํธํ๊ฐ ์์ต๋๋ค.
โ ๋์ค์ https์ ๋ฐ๋ก ์์ธํ ๊ณต๋ถํด์ ๊ฒ์๊ธ์ ์ฌ๋ ค๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๐
๐ ์ด์ ์ ๋ฆฌ ๊ธ โ
HTTP ํ๋กํ ์ฝ https://jungjjeong.github.io/cs/network/Network02/
[2] ์ปดํจํฐ ์๊ฐ ์๋ฆฌ
- ์ปดํจํฐ ์๊ฐ ํํ์ ์ํด ํ๋์จ์ด์ ์์คํ
ํด๋ญ ์ด์ฉ
- RTC(Real Time Clock) ๋ชจ๋ ์ฌ์ฉ
- ์์คํ ์๊ฐ์ ๊ฐ์ผ๋ก ํํํ ๊ฒ์ Timestamp
ํฌ์ธํธ๋ ์๊ฐ์ ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํด์ผ ํ ์ง ์ ๊ณ ๋ คํด์ผ ํ๋ค๋ ๊ฒ!
์๋น์ค์์ ์ฌ์ฉ๋๋ ์๊ฐ์ ์ฉ๋๋ณ๋ก ๋ง์ถฐ์ ๊ธฐ๋กํ ํ์๊ฐ ์์ต๋๋ค.
[3] ์ํธํ
ํ๋ฌธ์ ์ํธ๋ฌธ์ผ๋ก ๋ณํํ๋ ๊ฒ
๋จ๋ฐฉํฅ ์ํธํ
- ๋ณตํธํ๊ฐ ๋ถ๊ฐ๋ฅํ๊ฒ ํด์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํํ๋ ๋ฐฉ๋ฒ
- Rainbow Table์ ํตํด ์๋ฌธ์ ์์๋ผ ์๋ ์์ผ๋ Salt, Key stretching๋ฑ์ผ๋ก ์กฐ์น๋ฅผ ์ทจํ๋ค.
Salt : ํ๋ฌธ์ ์์์ ๋ฌธ์์ด ์ถ๊ฐํ์ฌ ์ํธํ
Key stretching : ํด์๋ฅผ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ์ฌ ์๊ธฐ ํ๋ค๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ
์๋ฐฉํฅ ์ํธํ
- ํ๋ฌธ์ ๋ณตํธํํ ์ ์๋ ํํ๋ก ๋์นญํค/๋น๋์นญํค ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ์ํธํํ๋ ๋ฐฉ๋ฒ
๋์นญํค ์ํธ ์๊ณ ๋ฆฌ์ฆ : ๊ฐ์ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ, ๋ณตํธํ ๊ฐ๋ฅ (ex. AES)
๋น๋์นญํค ์ํธ ์๊ณ ๋ฆฌ์ฆ : ๊ณต๊ฐํค์ ๊ฐ์ธํค๋ฅผ ์ฌ์ฉํ์ฌ ์ํธํ, ๋ณตํธํ (ex. RSA)
[4] ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
ํจ์ํ ํจ๋ฌ๋ค์์๋ ํจ์๊ฐ ์ต์ ๋จ์์ ๋๋ค!
ํจ์ ๋จ์๋ก ๋๋์ด์ง๋ฉด, ์ฌ์ฌ์ฉ์ฑ์ด ๊ต์ฅํ ๋๊ฒ ์ฃ
Q. โ12345โ๋ฅผ ํฉํด์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ
function sum(str) {
console.log(
str
.split("")
.map((x) => parseInt(x))
.reduce((x, y) => {
return x + y;
}, 0)
);
}
sum("12345"); // 15
๐ฃ ์ด๊ฒ ๋ญ ์ฝ๋๋
์ ๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ์ต์ํด์ ๋ด๋ถ ๋ก์ง์ ๋น์ทํ๊ฒ ์ง ๊ฒ ๊ฐ์ง๋ง, ๋ฌ๊ธ ์์ฑ์ ํจ์๋ผ..
๋ณด์ํด์ผ ํ ๋ถ๋ถ์ด ๋๋ฌด ๋ง๋ค๋ ๊ฒ์ด ๋ณด์
๋๋ค.
[4-1] ํน์ง
- ์ํ๊ฐ ์์ผ๋ฏ๋ก ์ฌ์ด๋ ์ดํํธ๊ฐ ์์ต๋๋ค.
- ์ฌ์ฌ์ฉ์ฑ์ด ๋์ต๋๋ค.
- ์ฝ๋๊ฐ ์งง๊ณ ๊ฐ๊ฒฐํฉ๋๋ค.
[4-2] ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
์ค๊ณ์ ๋ํ ํจ๋ฌ๋ค์๋ณด๋ค๋ ์ฌ๊ณ ์ ๋ํ ํจ๋ฌ๋ค์์ ๊ฐ๊น์ต๋๋ค.
โ ๋ฌด์์ ํด๊ฒฐํด์ผ ํ ์ง์ ์ง์คํฉ๋๋ค.
์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์์ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ด ๋น์ ๋ฐํฉ๋๋ค!
โ ๋ฐ์ดํฐ์ ์ ์ด ์์ด ํ์ํ ํจ์๋ง ์กฐํฉํ์ฌ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
[5] ๊ฐ์ฒด์งํฅ๊ณผ ํ๋กํ ํ์
[5-1] ๊ฐ์ฒด ์งํฅ
๊ฐ์ฒด ์งํฅ์ โ๊ฐ์ฒดโ๋ ํ์ค์ ์๋ ๊ฒ์ ์ถ์ํ ํ ๊ฒ์ด๋ผ ํ ์ ์์ต๋๋ค.
โ์ถ์โ์ด๋ ์ฌ๋ฌผ์ด ์ง๋๊ณ ์๋ ์ฌ๋ฌ ์ธก๋ฉด ์ค ํน์ ํ ๋ถ๋ถ๋ง ๋ณด๋ ๊ฒ์ด๋ผ ํ ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ฐ์ฒด ์งํฅ์ด๋ ๋ฌด์์ผ๊น์?
๊ฐ์ฒด ์งํฅ์ด๋ ๊ฐ์ฒด ์์ฃผ๋ก ํ๋ก๊ทธ๋๋ฐํ๋ ํจ๋ฌ๋ค์์ ๋๋ค. ์ต์ ๋จ์๋ ๊ฐ์ฒด๊ฐ ๋๊ฒ ์ฃ .
JS๋ ํ๋กํ ํ์ ์ ํตํด ๊ฐ์ฒด ์งํฅ์ ํํํฉ๋๋ค.
[5-2] ํ๋กํ ํ์
JS์์ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ๊ฐ์ฒด ๋ฆฌํฐ๋ด
- Object ์์ฑ์ ํจ์
- ์์ฑ์ ํจ์
EX) JS์ ๊ฐ์ฒด๋ง์ผ๋ก ๊ฐ์ฒด ์งํฅ ํ๋ก๊ทธ๋๋ฐ์ ์ง๋ด ์๋ค.
function Jiyoung(name, phone) {
this.name = name;
this.phone = phone;
this.getName = function () {
return this.name;
};
this.setName = function (name) {
this.name = name;
};
}
const info = new Jiyoung("์ ์ง์", "0101234");
const info2 = new Jiyoung("ํด์ฐ", "0109876");
console.log(info);
console.log(info2);
๋ ๊ฐ์ฒด ๋ชจ๋ ๋ค ๋ฉ์๋๊ฐ ๊ฐ๊ฐ ์ ์๋์ด ์์ต๋๋ค.
โ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์ผ์ด๋๊ฒ ๋์ฃ .
๋ฐ๋ผ์ ๊ธฐ์กด์ ๊ฐ์ฒด๋ฅผ ๋ณต์ฌํ์ฌ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ์์ธ โํ๋กํ ํ์ โ์ ์ด์ฉํฉ๋๋ค.
function Jiyoung(name, phone) {
this.name = name;
this.phone = phone;
Jiyoung.prototype.getName = function () {
return this.name;
};
Jiyoung.prototype.setName = function (name) {
this.name = name;
};
}
const info = new Jiyoung("์ ์ง์", "0101234");
const info2 = new Jiyoung("ํด์ฐ", "0109876");
console.log(info);
console.log(info2);
console.log(Jiyoung.constructor);
console.log(Jiyoung.__proto__);
console.log(info.constructor);
console.log(info.__proto__);
๊ฐ์ฒด๋ค์ ๊ฐ๊ฐ ํ๋กํ ๋ผ๋ ๋ด๋ถ์ ์ธ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ฒ ๋๊ณ , ๋ด๋ถ์์ ์์ ๊ฐ์ฒด๋ฅผ ๋งํฌํฉ๋๋ค.
์ด์ ๊ฐ์ด ํ๋กํ ํ์ ์ ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ผ ํ ์ ์์ต๋๋ค.
โ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์ผ์ด๋์ง ์๊ฒ ์ฃ .
[5-3] ํจ์จ์ ์ธ ํ๋กํ ํ์ ์ฌ์ฉ
- ์์ ํ๋ด๋ด๊ธฐ (1)
๋ถ๋ชจ ๊ฐ์ฒด๋ฅผ ์ด์ฉํ์ฌ ํ๋กํ ํ์ ํจ์๋ฅผ ์ ์ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
function Person(name) {
this.name = name;
}
Person.prototype.getName = function () {
return this.name || "Jiyoung";
};
function JYCompany(name) {}
JYCompany.prototype = new Person();
const jy1 = new Person("Jung Jiyoung");
const jy2 = new JYCompany("Lee Jiyoung");
console.log(jy1.getName());
console.log(jy2.getName());
์์ ๊ฐ์ฒด์ ํจ์(getName)๊ฐ ๋งํฌ๋์ด ํ์ ๊ฐ์ฒด์์ ์ด์ฉํ๋ ๋ชจ์ต์ ํ์ธํ ์ ์์ต๋๋ค.
- ์์ ํ๋ด๋ด๊ธฐ (2)
๋ด๋ถ์ ์ผ๋ก ์์ฑ๋ ํ๋กํ ํ์ ๋ณ์๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
apply ํจ์๋ฅผ ํตํด ๋ถ๋ชจ ์์ฑ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
function Person(name) {
this.name = name;
}
Person.prototype.getName = function () {
return this.name || "Jiyoung";
};
function JYCompany(name) {
Person.apply(this, arguments);
// this๋ฅผ ๋ฐ์ธ๋ฉํ์ฌ arguments(๋ฐฐ์ด ๊ฐ์ฒด) ํํ๋ก ํธ์ถ๋ ๊ฐ์ฒด์ ์ ๋ฌํฉ๋๋ค.
}
JYCompany.prototype = new Person();
JYCompany.prototype.setName = function (name) {
this.name = name;
};
const jy1 = new Person("Jung Jiyoung");
const jy2 = new JYCompany("Lee Jiyoung");
console.log(jy1.getName());
console.log(jy2.getName());
jy2.setName("Park Jiyoung");
console.log(jy2.getName());
๋ณ์๋ ๊ทธ๋๋ก ๋ด๊ธฐ๊ฒ ๋๋ ๋ชจ์ต์ ํ์ธํ ์ ์์ต๋๋ค.
- Object.create
๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ฌํ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋๋ค.
const jy1 = {
name: "Jung Jiyoung",
getName: function () {
return this.name;
},
};
const jy2 = Object.create(jy1);
// jy1์ ๋ณต์ ํด์ ๋ง๋ค์ด์ก์ต๋๋ค -> jy2์ ์์ ๊ฐ์ฒด๋ jy1 !!
jy2.name = "Park Jiyoung";
console.log(jy1.getName());
console.log(jy2.getName());
console.log(jy1.__proto__);
console.log(jy2.__proto__);
[6] ์ด๋ฒคํธ ๋ฃจํ
JS์ Call Stack์ ํ๋๋ง ์กด์ฌํฉ๋๋ค (์์ ํ์ ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค๊ณ ์ ๋ฒ ์๊ฐ์ ๋ฐฐ์ ๋ ์์ญ์ด์ฃ )
โ ์ฑ๊ธ ์ค๋ ๋๋ก ๋์ํฉ๋๋ค. ์ฆ ๋์์ ํ๋์ ์์ ๋ง์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค,
Call Stack
์ฝ๋๊ฐ ์คํ๋ ๋ ์์ด๋ ๊ณณ, Stack ํํ๋ก ์์ด๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์คํฌ๋ฆฝํธ๋ ์ด๋ป๊ฒ ๋น๋๊ธฐ์ ์ผ๋ก ๋์ํ ๊น์?
์ด๋ ๋ธ๋ผ์ฐ์ ์ ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. (๐ฒ ๋ธ๋ผ์ฐ์ ์ ํ์ ๋น๋ ค์!)
๋ธ๋ผ์ฐ์ ๋ ๋ฉํฐ ์ค๋ ๋๋ก ๋์ํ๊ธฐ ๋๋ฌธ์ ๋น๋๊ธฐ์ ์์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
[6-1] ๋์ ์๋ฆฌ (Task Queue)
- ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋๋ฉด Global Scope์์ ์คํ
- ์ฝ๋๊ฐ ์์ฐจ์ ์ผ๋ก ์คํ
- Call stack์ ์์๊ณผ ๋์์ Web API ์คํ (์ฝ๋ฐฑ ํจ์)
- ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด Call stack์์ ๋๊ฐ๊ณ , ๋ค์ ํจ์๊ฐ ์์ ๋๋ค.
- Web API์์ ์ฝ๋ฐฑ ํจ์๋ฅผ Task Queue์ ๋ฐ์ด๋ฃ๊ณ ,
Call stack์ด ๋น์ด์์ผ๋ฉด Task Queue์์ ๋์ ํด๋น ํจ์๋ค์ด ์์ ๋๋ค. (Tick : ํฑ) - ๋ค์ Call stack์ด ๋น๋ฉด ๋ค์ ์ฝ๋ฐฑ ํจ์๊ฐ Call stack์ ์์ด๊ฒ ๋ฉ๋๋ค.
Web API : ๋ธ๋ผ์ฐ์ ์์ ์ ๊ณตํ๋ API / ์ฝ๋ฐฑ ํจ์๋ฅผ Queue์ ๋ฃ์ด์ฃผ๋ ์ญํ
Task Queue : ๋น๋๊ธฐ๋ก ์คํ๋ ์ฝ๋ฐฑ ํจ์๊ฐ ๋ณด๊ด๋๋ ์์ญ
[6-2] ๋์ ์๋ฆฌ (Microtask Queue)
์ด๋ฒคํธ ๋ฃจํ๊ฐ Task Queue๋ณด๋ค ์ฐ์ ์ผ๋ก ํ์ธํ๋ ๊ณณ์ด Microtask Queue์ ๋๋ค.
๋ง์ฝ Microtask Queue์ ์ฝ๋ฐฑ ํจ์๊ฐ ์๋ค๋ฉด, ์ด๋ฅผ ๋จผ์ Call Stack์ ๋ฃ์ด์ค๋๋ค.
๋ ์ด์ Microtask Queue์ ์ฒ๋ฆฌํด์ผ ํ ์ฝ๋ฐฑ ํจ์๊ฐ ์๋ค๋ฉด, Task Queue๋ฅผ ํ์ธํ๊ณ ์ฒ๋ฆฌํฉ๋๋ค.
๋ํ์ ์ผ๋ก Promise์ then()์ ์ฝ๋ฐฑ(ํ๋ก๋ฏธ์ค์ ๋น๋๊ธฐ ํธ์ถ)์ Task Queue๊ฐ ์๋ Microtask Queue์ ๋ด๊ธฐ๊ฒ ๋ฉ๋๋ค.
[6-3] ๋์ ์๋ฆฌ (Animation Queue)
Animation Queue (= Animation Frames)๋ requestAnimationFrame์ ์ํด ๋ฑ๋ก๋ฉ๋๋ค.
requestAnimationFrame(function () {
console.log("animation");
});
Task Queue, Microtask Queue์ ๊ฐ์ ์ญํ ์ด๋ฉฐ, ์ฐ์ ์์๋
Microtask Queue > Animation Queue > Task Queue ์์ผ๋ก ์คํ๋ฉ๋๋ค.
(ํฌ๋กฌ ๊ธฐ์ค, ๋๋ก๋ Animation Queue๊ฐ Vsync์ ๋ง์ถฐ ํธ์ถ๋๋๋ผ Task๋ณด๋ค ํ์ ํธ์ถ๋ ์ ์์ต๋๋ค.)
๐ ์ ๋ฆฌ
JS๋ ๋น๋๊ธฐ ์์ ์ ์ํํ ๋, Web API๋ฅผ ํตํด ์ฌ๋ฌ Queue์ ๋ฑ๋ก๋ ์์ ๋ค์ ์ฐ์ ์์์ ๋ฐ๋ผ ๊บผ๋ด์ ์ฒ๋ฆฌํฉ๋๋ค.
[7] ๋ชจ๋
์คํฌ๋ฆฝํธ ๊ฐ ์์กด๋๋ฅผ ํ์ ํ ์ ์๊ณ , ์คํ ์์๋ฅผ ์ฝ๊ฒ ์ ์ดํ ์ ์์ด ๋ชจ๋์ ์ฌ์ฉํฉ๋๋ค.
๋ชจ๋๊ณผ ์ปดํฌ๋ํธ
๋ชจ๋์ ์ค๊ณ ์์ ์ ์๋ฏธ ์๋ ์์์ด๋ฉฐ (์์์ ์ผ๋ก ๋๋ ๋์ ์์)
์ปดํฌ๋ํธ๋ ๋ฐํ์ ์์ ์ ์๋ฏธ ์๋ ์์์ ๋๋ค. (์คํ๋๋ ์์)
โ ํ์ง๋ง JS์ ๋ชจ๋์ ์ง์ ๋ฐํ์์ ์คํ์ด ๋ฉ๋๋ค ๐ฎ
โ ์ฉ์ด์ ์๋ฏธ๋ง ์ ํํ ํ์ ํด ๋์ผ๋ฉด ๋ ๋ฏ!
[7-1] JS์์์ ๋ชจ๋
- use strict(์๊ฒฉ ๋ชจ๋) ์คํ
- ์ผ๋ฐ script์์๋ let์ด๋ var์ ์ ์ธํ๊ณ ๋ณ์ ์ ์ธ ๊ฐ๋ฅ(Global Scope ์ ์ฅ)
- ํ์ง๋ง ๋ชจ๋๋ก ์ฌ์ฉํ๊ฒ ๋๋ฉด ์ด๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
- ์์ฒด์ ์ธ ๋ชจ๋ ๋ ๋ฒจ ์ค์ฝํ
- import, export ํ์ง ์๋ ํ ์๋ก ์ฐธ์กฐํ ์ ์์ต๋๋ค.
- ๋จ ํ๋ฒ๋ง ํ๊ฐ
- ํ ํ์ผ์์ 2๋ฒ ์ด์ import ๋๋๋ผ๋, ์คํ์ ํ๋ฒ๋ง!
- ์ง์ฐ ์คํ
- ๋ชจ๋ DOM์ด ๋ง๋ค์ด ์ง ํ์ ์คํ์ด ๋ฉ๋๋ค.
[8] ์ ๋์ฝ๋
์ ๋์ฝ๋๋ ์ ์๊ฒผ์๊น์?
โ ๋ค์ํ ๋๋ผ๊ฐ ์๋ก ๋ค๋ฅธ ์ธ์ฝ๋ฉ ๋ฐฉ์์ ์ฌ์ฉํจ์ผ๋ก์จ, ํธํ์ฑ ๋ฐ ํ์ฅ์ฑ์ ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผฐ๊ธฐ ๋๋ฌธ์ ๋๋ค.
โ ๋ฐ๋ผ์ ์ ์ธ๊ณ ๋ฌธ์๋ฅผ ์ปดํจํฐ์์ ๋ค๋ฃฐ ์ ์๋๋ก ํ์ค ์์คํ (=์ ๋์ฝ๋)์ด ๋์์ต๋๋ค.
[9] ์ ๊ทํํ์
์ ๊ทํํ์์ ์ด์ฉํ๋ฉด ํจํด์ ์ด์ฉํ์ฌ ์ํ๋ ๋ฌธ์๋ฅผ ๊ฒ์/๋์ฒด/์ถ์ถ
ํ ์ ์์ต๋๋ค.
์ฑ๋ฅ์ ๋งค์ฐ ๋๋ฆฌ์ง๋ง, ๋๋ฌด ํธํฉ๋๋ค.
์ ๊ท ํํ์ ์๋ํฐ : https://rubular.com/
๐ฃ ์ค์ตํด ๋ณด์์ต๋๋ค.
๋๋ต์ ์ธ ๋ฌธ๋ฒ๋ง ์์๋๋ฉด ํด๋น ์๋ํฐ๋ฅผ ์ฌ์ฉํด์ ์ฝ๊ฒ ์ ๊ท ํํ์์ ๋ง๋ค ์ ์์ต๋๋ค.
JS์์๋ RegExp ๊ฐ์ฒด๋ก ์ ๊ท ํํ์ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- test : ์ ๋ ฅ๋ฐ์ ๋ฌธ์์ด์ ์ฐพ๋ ํจํด์ด ์๋์ง ํ์ธ ํ, ์๋ค๋ฉด true / ์๋ค๋ฉด false
- exec : ์ ๋ ฅ๋ฐ์ ๋ฌธ์์ด์ ์ฐพ๋ ํจํด์ด ์๋์ง ํ์ธ ํ, ์๋ค๋ฉด ํจํด ์ ๋ณด(๋ฌธ์์ด) / ์๋ค๋ฉด null
- match : String ๊ฐ์ฒด์์์ exec ํจ์ (matchAll๋ ์์ด์)
- replace : String ๊ฐ์ฒด์์ ํจํด์ ์ฐพ์ ํ, ์ผ์นํ ํจํด ์ ๋ณด๋ฅผ ๋ฌธ์์ด๋ก ๋ณํ
- search : String ๊ฐ์ฒด์์ ํจํด์ ์ฐพ์ ํ, ์ผ์นํ ํจํด ์ ๋ณด์ ์์น ๋ฐํ
- capture : () ๋ก ๊ฐ์ธ๋ฉฐ ์ฌ์ฉ / match ๋ฐํ๊ฐ์ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ์บก์ณ ๊ฒฐ๊ณผ ํฌํจ
[9-1] ๊ฐ๋ฏธ ์์ด ํ์ด๋ณด๊ธฐ
โ ๐ฃ ํธ๋์ค ์ถ๊ฐ ์์
[10] ์ฟ ํค์ ์ธ์ , ์น ์คํ ๋ฆฌ์ง
HTTP ํต์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค. (๋จ๋ฐ์ฑ)
๋ฐ๋ผ์ ์๋ฒ๋ ์์ฒญ์ด ์ด๋ค ๋ธ๋ผ์ฐ์ ์์ ์จ ๊ฒ์ธ์ง ์ ์ ์๊ฒ ์ฃ .
์ด๋ ํค๋์ ์ฟ ํค๋ฅผ ๋ด์ผ๋ฉด ์๋ฒ๊ฐ ์ฟ ํค๋ฅผ ์ด๋์ ์ฝ์ด ์จ ๊ฒ์ธ์ง ์ ์ ์์ต๋๋ค.
[10-1] ์ฟ ํค
์ฟ ํค๋ ํ๋ก ํธ์๋(ํด๋ผ์ด์ธํธ)์์ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ์ดํฐ์ ๋๋ค.
์๋ฒ์์ Set-Cookie๋ฅผ Response ํค๋๋ก ๋ด๋ ค์ฃผ๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ฐ์ ๊ฐ(Key-Value ํํ)์ ํ์ฑํ์ฌ ์ ์ฅํ ์ ์์ต๋๋ค.
๐ฎ ์ฟ ํค์ ์ต์
- Expires : ์ฟ ํค ๋ง๋ฃ ๋ ์ง ์ง์
- Secure : HTTPS์์๋ง ์ฟ ํค ์ ์ก
- HttpOnly : JS์์ ์ฟ ํค์ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ๋ง์ต๋๋ค.
- Max-Age : ์ฟ ํค ์๋ช ์ ์ ํฉ๋๋ค. (Expires ๋ฌด์)
- Domain : ๋๋ฉ์ธ์ด ์ผ์นํ๋ ์์ฒญ๋ง ์ฟ ํค๊ฐ ์ ์ก๋ฉ๋๋ค.
- Path : ๊ฒฝ๋ก์ ์ผ์นํ๋ ์์ฒญ๋ง ์ฟ ํค๊ฐ ์ ์ก๋ฉ๋๋ค.
ํ์ง๋ง ์ฟ ํค์๋ ์ฌ๋ฌ ๋จ์ ์ด ์์ต๋๋ค.
- XSS(Cross-Site Script) ๊ณต๊ฒฉ์ ๋นํ ์ ์์ต๋๋ค.
- ์ฟ ํค๋ฅผ ์ํธํํ์ง ์์ ๊ฒฝ์ฐ, ์ค๊ฐ์ ํ์ทจ๋นํ ์ ์์ต๋๋ค.
- ์๋ฒ์์๋ ์ด๋ค ํด๋ผ์ด์ธํธ์์ ์ฟ ํค๋ฅผ ๋ณด๋๋์ง(์ฟ ํค ์ฃผ์ธ์) ์์ง ๋ชปํฉ๋๋ค.
XSS
JS๋ฅผ ์ด์ฉํด ์ ์์ ์ธ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ฌ์ฉ์์ ์ฟ ํค ๊ฐ ํ์ทจ
[10-2] ์ธ์
์ฟ ํค์ HTTP ์ธ์ ID๋ฅผ ์๋ณ์๋ก ๋ด์ ์ฌ์ฉ์๋ฅผ ๊ตฌ๋ถํ ์ ์์ต๋๋ค.
ํ์ง๋ง ์ธ์ ์๋ ์น๋ช ์ ์ธ ๋จ์ ์ด ์์ต๋๋ค.
- ์ธ์ ์ ์๋ฒ์ ํ์ผ๋ก ์ ์ฅ๋์ด ๊ณผ๋ถํ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- ์๋ฒ์ ์๊ฐ ๋ง๋ค๋ฉด, ์ธ์ ๊ด๋ฆฌ๊ฐ ์ด๋ ต์ต๋๋ค.
๋ฐ๋ผ์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ ์ธ์ฆ์ ๋ณ๋ ํ ํฐ์ ์ฌ์ฉํ๋ฉฐ
์ฟ ํค๋ ํด๋ผ์ด์ธํธ ์์ฒด์ ์ธ ์ง์์ ์ธ ๋ฐ์ดํฐ ๊ด๋ฆฌ ์ฉ๋๋ก ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
[10-3] ์น ์คํ ๋ฆฌ์ง
์ฟ ํค ๋์ ํด๋ผ์ด์ธํธ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํ ์๋ก์ด ๋ฐฉ๋ฒ์ธ ์น ์คํ ๋ฆฌ์ง๊ฐ ์์ต๋๋ค.
์น ์คํ ๋ฆฌ์ง์๋ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ธ์ ์คํ ๋ฆฌ์ง๊ฐ ์์ต๋๋ค.
์ฟ ํค์ ๋ง์ฐฌ๊ฐ์ง๋ก Key-Value ํํ๋ก ์ ์ฅ๋ฉ๋๋ค.
- ๋ก์ปฌ ์คํ ๋ฆฌ์ง
๋ก์ปฌ ์คํ ๋ฆฌ์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๊ฒฝ์ฐ, ๋ฐ์๊ตฌ์ ์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋ฉ๋๋ค.
- ์ธ์ ์คํ ๋ฆฌ์ง
์ ์ฐฝ์ ์์ฑํ ๋๋ง๋ค ๊ฐ๋ณ์ ์ผ๋ก ์ ์ฅ๋๋ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ๋ค๋ฅด๊ฒ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋ซ๋ ์๊ฐ ์ฌ๋ผ์ง๋๋ค. (ํ๋ฐ์ฑ)
[10-4] IndexedDB
ํธ๋ ์ ์ ์ด ๊ฐ๋ฅํ ๋ก์ปฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋๋ค.
IndexedDB๋ ๋ง์ ์์ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์กฐํํด์ ์ ์ฅํ๋๋ฐ ์ ์ฉํฉ๋๋ค.
์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํด ๋ฐ์ดํฐ๋ฅผ ๊ณ ์ฑ๋ฅ์ผ๋ก ํ์ํ ์ ์์ต๋๋ค.
์ถ์ฒ
https://resilient-923.tistory.com/308
๋๊ธ๋จ๊ธฐ๊ธฐ