DAY 12
📚 IT 5분 잡학사전
🔖오늘 읽은 범위: episode 35~38
비밀번호 시스템의 잘못된 예 2가지
1) 비밀번호를 DB에 그대로 저장하기
DB에 접근할 수 있는 운영자나 개발자가 유저의 비밀번호를 알 수 있어서 보안에 취약하다.
2) DB자체를 암호화해서 비밀번호 저장하기
유저가 회사에서 주는 키(key)로 DB를 해제한 후, 입력한 비밀번호와 DB에 저장된 비밀번호를 대조하여 맞으면 로그인한다. 로그인을 마치면 DB의 비밀번호 부분이 다시 잠기는 방식이다.
이 방법은 첫 번째 방법보다는 낫지만 key를 잃어버리거나 누군가 key를 훔칠 수 있기 때문에 보안이 취약하다.
괜찮은 비밀번호 시스템의 예
- 해시함수
해시함수를 사용하면 비밀번호 시스템을 더 안전하게 구현할 수 있다. 해시함수는 비밀번호 DB 앞에 살고 있는 마법사 같은 녀석으로, 유저가 입력한 값을 무작위 값으로 둔갑시켜준다.
(규칙 1) 동일한 입력 값에 대해 동일한 출력값을 가진다.
: 일대일 대응관계 유지
(규칙 2) 입력값이 아주 살짝만 바뀌어도 출력값은 엄청나게 크게 바뀐다.
: 무작위성
(규칙 3) 반대로 입력한다고 해서 원래 값이 나오지 않는다.
: 한쪽 방향으로만 설계됨
해시 함수의 3가지 규칙을 이용해 비밀번호 시스템을 만들고, 비밀번호 시스템을 해시 함수에 통과 시켜 얻은 무작위 결갓값을 DB에 저장하면, DB에 접근할 수 있는 개발자가 DB에서 해시값을 보더라도 원래 비밀번호를 알 수 없기 때문에 비교적 안전하다.
레인보우 테이블(Rainbow Table)이란 해시함수가 변경한 값을 원래의 값과 연결한 표를 말한다.
해시 함수를 통과한 값을 레인보우 테이블에서 찾아보면 원래 값을 알 수 있기 때문에 레인보우 테이블이 털릴 경우 보안이 취약해진다.
솔트(Salt)는 아주 조그마한 무작위 텍스트이다.
비밀번호를 무작위 텍스트인 솔트와 합쳐서 해시함수에 통과시키면 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수가 없기 때문에 안전하게 비밀번호 시스템을 구현할 수 있다.
프로그래밍 패러다임이란 프로그래머가 프로그래밍 할 때의 관점, 방식 등을 말한다. 즉, 프로그래밍 하는 사고의 틀이라고 생각하면 된다.
프로그래밍 언어는 이러한 프로그래밍 패러다임을 하나 또는 하나 이상을 지원한다.
그냥 프로그래밍 관점, 방식을 공부한다고 생각하고 가벼운 마음으로 객체 지향 프로그래밍이 무엇인지 알아보자!
객체 지향 프로그래밍을 게임 만드는 과정으로 이해해보자.
<유명인 대전>이라는 게임을 만든다고 상상해보자.
주인공, 각 플레이어를 만들어야 하는데 플레이어는 data를 가지고 있다.
이름 | 빌 게이츠 |
---|---|
체력 | 85 |
스킬 | 프로그래머 |
const player = {
name: “Bill Gates”,
health: 85,
skill: “Programmer”,
};
//Player 클래스 만들기
class Player {
constructor(name, health, skill){
this.name = name;
this.health = health;
this.skill = skill;
this.xp = 0;
}
}
//클래스 공장 이용하여 플레이어 생성하기
const bill = new Player(“Bill Gates”, 85, “Programmer”)
const elon = new Player(“Elon Musk”, 90, “CEO”)
상속이란 이름 그대로 상속해 주는 개념이다. 상속이란 클래스와 관련된 것으로 코드의 효율성을 높여주는 개념으로, “재산을 상속한다”에서 부모가 자식에게 재산을 물려주듯이 클래스에서도 동일하게 속성을 상속할 수 있다.
인간은 아기, 청소년, 성인 같이 여러 단계를 거치며 특징고 성격이 달라지는데, 이를 class의 상속으로 표현해 보자.
class Human { // 휴먼 클래스
constructor(name){
this.name = name; // 이름, 팔 2개, 다리 2개 있음
this.arms = 2;
this.legs = 2;
}
}
class Teenager { //청소년 클래스
constructor(name){
this.name = name;
this.arms = 2;
this.legs = 2; //Human 클래스와 동일한 속성
this.emotional = true; // 감정적
}
curse(){ //친구 욕하는 기능
return `!@#$%#$$@#`;
}
}
아기, 청소년, 성인 모두 다르지만 결국은 인간이라는 것은 동일하다.
이 처럼 코드가 중복되는데, 이를 해결 하기 위해 상속을 사용할 수 있다.
코드 중복을 해결 하기 위해 기본이 되는 Human 클래스를 나머지 클래스에 상속시키면된다.
상속을 이용하면 Human 클래스의 기본 속성은 다 가지면서도 자신만의 속성을 추가 할 수 있다.
class Human { // 휴먼 클래스
constructor(name){
this.name = name; // 이름, 팔 2개, 다리 2개 있음
this.arms = 2;
this.legs = 2;
}
}
//청소년 클래스
class Teenager extends Human { //Human 클래스 속성 상속받음
constructor(name){
this.emotional = true; // 감정적
}
curse(){ //친구 욕하는 기능
return `!@#$%#$$@#`;
}
}
//아기 클래스
class Baby extends Human { //Human 클래스 속성 상속받음
constructor(name){
this.cute = true; // 귀여움
}
cry(){ //우는 기능
return `ㅠㅇㅠ`;
}
}
상속의 장점
함수형 프로그래밍은 버그가 발생하기 어려운 구조이기 때문에 개발자에게 유용하므로 꼭 배우자!
샌드위치 만드는 방법으로 선언형/명령형 프로그래밍의 차이를 알아보자.
선언형 프로그래밍 | 명령형 프로그래밍) | |
---|---|---|
방법 | ”BLT 샌드위치를 만들어줘!“ | 1. 식빵 2개를 꺼내 구워라! 2. 양상추 2장 씻고, 토마토를 썰어 2조각을 준비하고, 구운 베이컨 3개를 준비해라! 3. 1의 빵 하나에 2의 재료를 쌓고 1의 나머지 빵을 덮어라! |
원하는 결괏값을 선언한다. (샌드위치) | 원하는 결괏값에 어떻게 도달하는지 선언한다. (샌드위치 만드는 방법) | |
대표적인 언어 | CSS 배경색 바꾸고 싶으면 배경색을 분홍색으로 바꾸라고 선언함 | |
특징 | 결과 중심으로 코드작성 실수할 가능성 적음 동료들이 코드 이해하기 쉬움 | 할일 세세하게 지시 가능 그대신 개발자가 실수하기 쉬움 동료가 이해하기 어려울 수도 있음 |
텍스트에서 공백을 ❤️로 바꾸는 코드를 작성해보자.
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;
}
function spaceToHeart(text){
return text.replaceAll (“ ”, “❤️”);
모든 선언형 프로그래밍은 명령형 프로그래밍 위에 쓴다고 이야기 할 수 있다.
홀수 제거하는 코드를 함수형 프로그래밍으로 작성해보자.
function checkForOdd(item){
return item % 2 === 0;
}
function removeOdd(items){
return items.filter(checkForOdd);
//checkForOdd 함수를 filter의 인자로 보냄
}
함수형 프로그래밍에서는 위 처럼 함수를 인자로 보내는 방식을 많이 사용한다.
함수형 프로그래밍은 함수 중심으로 코드를 적는 방식으로, 선언형 프로그래밍 콘셉트를 유지한다.
객체 지향 프로그래밍과 함수형 프로그래밍 무엇인지 개념을 잡을 수 있어서 좋았다.
프로그래밍 패러다임
객체 지향 프로그래밍
함수형 프로그래밍