TIL - DAY 8
📝 책에서 기억하고 싶은 내용을 써보세요.
35. 비밀번호는 어떻게 저장될까?
비밀번호 시스템 구현, 어떻게 해야 할까?
비밀번호 시스템의 잘못된 예
- 비밀번호를 데이터베이스에 그대로 저장하는것 (비밀번호 시스템을 구축한 사람도 비밀번호를 볼 수 있어서는 안됨)
- 데이터베이스 자체를 암호화해서 아무도 볼 수 없게 만든 후 비밀번호를 저장
- 사용자는 회사에서 주는 키로 데이터베이스를 해제한 후 로그인, 키로 비밀번호가 저장된 부분을 해제하고 나서 입력한 비밀번호와 대조해서 맞으면 로그인 성공, 로그인 마치면 다시 데이터베이스의 비밀번호 부분을 잠금
- 키를 잃어버리거나 키를 누군가 훔쳐갈 수 있다.
비밀번호 시스템의 좋은 예
- 해시 함수 사용 (비밀번호 데이터베이스 앞에 살고있는 마법사 같은 녀석, 비밀번호 입력시 무작위 값으로 변경)
마법사 해시 함수는 어떻게 동작하지?
- 동일한 입력값에 대해 동일한 출력값을 가진다. (일대일 대응 관계가 계속 유지됨)
- 입력값이 아주 살짝만 바뀌어도 출력값은 엄청나게 바뀐다.
- 반대로 입력한다고 해서 원래 값이 나오지 않는다. (한쪽 방향으로만 설계된 함수)
해시 함수도 완벽하진 않다, 레인보우 테이블(rainbow table)
- 해시 함수가 변경한 값을 원래의 값과 연결한 표 (마법사의 비밀 책 같은것)
- 해시 함수를 통과한 값은 레인보우 테이블에서 찾아보면 원래 값을 알 수 있다.
최종 병기, 솔트(salt)
- 솔트 = 무작위 텍스트
- 비밀번호와 솔트를 합쳐서 해시 함수에 통과시키기
- 비밀번호와 무작위 텍스트 솔트를 합치면 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수 없다.
36. 객체 지향 프로그래밍이 뭐죠? (1)
프로그래밍 패러다임(programming paradigm)이란?
- 프로그래머가 프로그래밍을 할 때의 관점, 방식, 프로그래밍을 하는 사고의 틀
- 프로그래밍 언어는 프로그래밍 패러다임을 하나 또는 하나 이상을 지원한다. (자바: 객체 지향 프로그래밍, 함수형 프로그래밍)
- 대표적 프로그래밍 패러다임
- 절차 지향 프로그래밍
- 객체 지향 프로그래밍
- 함수형 프로그래밍
게임 만드는 과정으로 이해하는 객체 지향 프로그래밍
유명인 대전 게임 플레이어
1
2
3
4
5
6
7
const player = {
name: "Bill Gates",
health: 85,
skill: "Programmer",
};
// 딱 한 명만 만들 계획이라면 OK, 보통 혼자는...
플레이어를 3명으로 계획
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
const player1 = {
name: "Bill Gates",
health: 85,
skill: "Programmer",
};
const player2 = {
name: "Elon Musk",
health: 90,
skill: "Tesla",
};
const player3 = {
name: "Warren Buffett",
health: 100,
skill: "Investor",
};
// 뭔가 비효율적, 같은 속성 name, health, skill 추후에 속성이 추가 된다면?
플레이어 공장, 클래스 등장!!
플레이어를 인형처럼 찍어준다, 재료만 넣어주면 나머지 코드 ok
직접 입력하는 양도 줄고, 속성도 오타가 나지 않도록 피할 수 있다.
→ 객체 지향 프로그래밍의 클래스(class)라는 개념
1
2
3
4
5
6
7
8
9
10
11
12
class player {
constructor(name, health, skill) {
this.name = name;
this.health = health;
this.skill = skill;
this.xp = 0; // xp는 기본값이 0이므로 재료로 받을 필요가 없다! 공장에서 기본으로 제공!!
}
};
const bill = new Player("Bill Gates", 85, "Programmer")
const elon = new Player("Elon Musk", 90, "Tesla"
const warren = new Player("Warren Buffett", 100, "Investor")
37. 객체 지향 프로그래밍이 뭐죠? (2)
이름 그대로 상속해 주는 개념, 상속
심즈
게임을 만들며 배우는 상속
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Human {
constructor(name) {
this.name = name;
this.arms = 2;
this.legs = 2;
}
}
class Teenager {
constructor(name) {
this.name = name;
this.arms = 2;
this.legs = 2;
this.emotional = true;
}
curse() {
return `%^$@#$`;
}
}
class Baby {
constructor(name) {
this.name = name;
this.arms = 2;
this.legs = 2;
this.cute = true;
}
cry() {
return `waa waa`;
}
}
// 중복 해결??
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 기본이 되는 Human 클래스를 나머지 클래스에 상속
class Human {
constructor(name) {
this.name = name;
this.arms = 2;
this.legs = 2;
}
}
class Teenager extends Human {
constructor(name) {
this.emotional = true;
}
curse() {
return `%^$@#$`;
}
}
class Baby extends Human {
constructor(name) {
this.cute = true;
}
cry() {
return `waa waa`;
}
}
// 중복 해결
38. 함수형 프로그래밍이 뭐죠?
지원하는 언어: 자바, 자바스크립트, 파이썬…
버그가 발생하기 어려운 구조
샌드위치 만들기로 배우는 함수형 프로그래밍
선언형 프로그래밍 → 원하는 결과값 선언
- BLT 샌드위치 만들어줘!
- 대표적인 예: CSS
명령형 프로그래밍 → 원하는 결과값에 어떻게 도달 하는지 선언
- 토스트 빵 2개를 꺼내서 구워!
- 양상추 2-3장을 씻고, 토마토를 얇게 썰어 2조각 준비하고, 구운 베이컨 3개를 준비해!
- 1의 토스트 빵 1개 위에 2의 재료를 쌓은 다음, 나머지 토스트 빵 1개로 덮어!
자바스크립트로 보는 명령형 프로그래밍과 선언형 프로그래밍의 차이
명령형: 할 일을 세세하게 지시할 수 있는 대신 개발자가 실수하기 쉽고, 작성한 코드를 동료가 이해하기 어렵다:
선언형: 결과 중심으로 코드를 작성, 실수 적고, 동료가 코드를 이해하기 쉽다.
명령형 프로그래밍 - 공백을 ❤️로 바꾸기
1
2
3
4
5
6
7
8
9
10
11
function spaceToHeart(text) { // text 가져와
let result = "";
for (let i = 0; i < text.length; i++) { // 글자 1개씩 다 비교해
if (text[i] === " ") {
result += "❤️"; // 만약 공백이면 ❤️로 교체해
} else {
result += text[i] // 공백이 아니면 패스
}
}
return result;
}
선언형 프로그래밍 - 공백을 ❤️로 바꾸기
1
2
3
function spaceToHeart(text) {
return text.replaceAll(" ", "❤️");
}
홀수를 제거하는 코드를 함수형 프로그래밍으로 작성해 보기
1
2
3
4
5
6
7
function checkForOdd(item) {
return item % 2 === 0;
}
function removeOdd(items) {
return items.fillter(checkForOdd); // checkForOdd라는 함수를 인자로 보냈네!
}
🔥 오늘 TIL 3줄 요약
- 비밀번호와 무작위 텍스트
솔트
를 합치면 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수 없다. - 프로그래밍 패러다임은 프로그래머가 프로그래밍을 할 때의 관점, 방식, 프로그래밍을 하는 사고의 틀
- 대표적 프로그래밍 패러다임: 절차 지향 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍
🤩 오늘 읽은 소감은? 떠오른 생각을 가볍게 적어보세요
거의 끝나간다!!!
🔖 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
Comments powered by Disqus.