[노개북] 09. TIL: IT 5분 잡학사전 e.35~38

summereuna🐥·2023년 1월 24일
0

노개북

목록 보기
9/11

TIL (2023.1.24.화)

DAY 12
📚 IT 5분 잡학사전
🔖오늘 읽은 범위: episode 35~38


📝 책에서 기억하고 싶은 내용을 써보세요.


35장. 비밀번호는 어떻게 저장될까?

1. 비밀번호 시스템 구현하는 방법

  1. 비밀번호 시스템의 잘못된 예 2가지
    1) 비밀번호를 DB에 그대로 저장하기
    DB에 접근할 수 있는 운영자나 개발자가 유저의 비밀번호를 알 수 있어서 보안에 취약하다.
    2) DB자체를 암호화해서 비밀번호 저장하기
    유저가 회사에서 주는 키(key)로 DB를 해제한 후, 입력한 비밀번호와 DB에 저장된 비밀번호를 대조하여 맞으면 로그인한다. 로그인을 마치면 DB의 비밀번호 부분이 다시 잠기는 방식이다.
    이 방법은 첫 번째 방법보다는 낫지만 key를 잃어버리거나 누군가 key를 훔칠 수 있기 때문에 보안이 취약하다.

  2. 괜찮은 비밀번호 시스템의 예
    - 해시함수
    해시함수를 사용하면 비밀번호 시스템을 더 안전하게 구현할 수 있다. 해시함수는 비밀번호 DB 앞에 살고 있는 마법사 같은 녀석으로, 유저가 입력한 값을 무작위 값으로 둔갑시켜준다.

2. 마법사 해시함수의 작동 방법

  1. (규칙 1) 동일한 입력 값에 대해 동일한 출력값을 가진다.
    : 일대일 대응관계 유지

  2. (규칙 2) 입력값이 아주 살짝만 바뀌어도 출력값은 엄청나게 크게 바뀐다.
    : 무작위성

  3. (규칙 3) 반대로 입력한다고 해서 원래 값이 나오지 않는다.
    : 한쪽 방향으로만 설계됨

해시 함수의 3가지 규칙을 이용해 비밀번호 시스템을 만들고, 비밀번호 시스템을 해시 함수에 통과 시켜 얻은 무작위 결갓값을 DB에 저장하면, DB에 접근할 수 있는 개발자가 DB에서 해시값을 보더라도 원래 비밀번호를 알 수 없기 때문에 비교적 안전하다.

3. 해시함수도 완벽하지 않다! 레인보우 테이블(Rainbow Table)

레인보우 테이블(Rainbow Table)이란 해시함수가 변경한 값을 원래의 값과 연결한 표를 말한다.
해시 함수를 통과한 값을 레인보우 테이블에서 찾아보면 원래 값을 알 수 있기 때문에 레인보우 테이블이 털릴 경우 보안이 취약해진다.

4. 최종병기, 솔트(Salt)

솔트(Salt)는 아주 조그마한 무작위 텍스트이다.
비밀번호를 무작위 텍스트인 솔트와 합쳐서 해시함수에 통과시키면 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수가 없기 때문에 안전하게 비밀번호 시스템을 구현할 수 있다.


36. 객체 지향 프로그래밍 (1): 프로그래밍 패러다임과 클래스

1. 프로그래밍 패러다임(Programming paradigm)

프로그래밍 패러다임이란 프로그래머가 프로그래밍 할 때의 관점, 방식 등을 말한다. 즉, 프로그래밍 하는 사고의 틀이라고 생각하면 된다.

프로그래밍 언어는 이러한 프로그래밍 패러다임을 하나 또는 하나 이상을 지원한다.

  • 대표적인 프로그래밍 패러다임
    1. 절차 지향 프로그래밍
    2. 객체 지향 프로그래밍
    3. 함수형 프로그래밍

그냥 프로그래밍 관점, 방식을 공부한다고 생각하고 가벼운 마음으로 객체 지향 프로그래밍이 무엇인지 알아보자!

2. 객체 지향 프로그래밍

객체 지향 프로그래밍을 게임 만드는 과정으로 이해해보자.
<유명인 대전>이라는 게임을 만든다고 상상해보자.

  • 주인공, 각 플레이어를 만들어야 하는데 플레이어는 data를 가지고 있다.

    이름빌 게이츠
    체력85
    스킬프로그래머
  1. 플레이어의 데이터를 JS로 표현해 보자.
    const player = {
    name: “Bill Gates”,
    health: 85,
    skill: “Programmer”,
    };
  • 플레이어가 1명 뿐이라면 이렇게 코딩해도 되겠지만 보통 플레이어는 더 많다. 모든 플레이어가 동일한 속성(name, health, skill)을 가지는데 각각의 플레이어의 코드를 따로 작성하는 것은 비효율적이다.
  1. 공장, 클래스의 등장!
    재료만 공장에 넣어주면 코드는 공장이 찍어주듯이, name, health, xp, skill의 값만 넣으면 나머지 코드는 공장이 찍어 주게 만들어보자.
    이런 개념이 바로 갹체 지향 프로그래밍Class(클래스)이다.
    클래스는 속성은 같지만 data는 다른 객체들을 위한 공장 같은 것이다.
  • 클래스의 장점
    • 직접 입력하는 코드 양 감소
    • 속성 입력시 오타 발생 위험 감소
    • 새 속성 부여시 공장에 알려주기만 하면 됨
  • 코드 개선: JS로 구현한 Player class
    //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)

37장. 객체 지향 프로그래밍 (2): 상속

상속이란 이름 그대로 상속해 주는 개념이다. 상속이란 클래스와 관련된 것으로 코드의 효율성을 높여주는 개념으로, “재산을 상속한다”에서 부모가 자식에게 재산을 물려주듯이 클래스에서도 동일하게 속성을 상속할 수 있다.

<심즈>게임 만들며 배우는 상속

인간은 아기, 청소년, 성인 같이 여러 단계를 거치며 특징고 성격이 달라지는데, 이를 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 `ㅠㅇㅠ`;
     }
}

상속의 장점

  • 코드 양이 줄어든다.
  • 의미가 더 명확해 진다.

38. 함수형 프로그래밍

함수형 프로그래밍은 버그가 발생하기 어려운 구조이기 때문에 개발자에게 유용하므로 꼭 배우자!

  • 함수형 프로그래밍을 지원하는 언어
    : 자바, 자바스크립트, 파이썬 등

1. 프로그래밍 패러다임의 큰 갈래인 선언형/명령형 프로그래밍의 차이

샌드위치 만드는 방법으로 선언형/명령형 프로그래밍의 차이를 알아보자.

선언형 프로그래밍명령형 프로그래밍)
방법”BLT 샌드위치를 만들어줘!“1. 식빵 2개를 꺼내 구워라!
2. 양상추 2장 씻고, 토마토를 썰어 2조각을 준비하고, 구운 베이컨 3개를 준비해라!
3. 1의 빵 하나에 2의 재료를 쌓고 1의 나머지 빵을 덮어라!
원하는 결괏값을 선언한다.
(샌드위치)
원하는 결괏값에 어떻게 도달하는지 선언한다.
(샌드위치 만드는 방법)
대표적인 언어CSS
배경색 바꾸고 싶으면 배경색을 분홍색으로 바꾸라고 선언함
특징결과 중심으로 코드작성
실수할 가능성 적음
동료들이 코드 이해하기 쉬움
할일 세세하게 지시 가능
그대신 개발자가 실수하기 쉬움
동료가 이해하기 어려울 수도 있음

2. JS로 보는 명령형/선언형 프로그래밍의 차이

텍스트에서 공백을 ❤️로 바꾸는 코드를 작성해보자.

  1. 명령형 프로그래밍
    말 그대로 텍스트 공백을 어떻게 해야 하는지 하나씩 명령하여 알려준다.
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. 선언형 프로그래밍
    바꾸고 싶은 text를 함수에 넣으면 공백을 replaceAll로 ❤️로 바꾸라고 선언한다.
function spaceToHeart(text){
   return text.replaceAll (“ ”, “❤️”);
  • replaceAll함수는 실제로 명령형 프로그래밍으로 따로 작성되어 있겠지만, 선언형 프로그래밍인 이 spaceToHeart 함수에서는 replaceAll이 어떤 작업을 하는지는 중요하지 않다.

모든 선언형 프로그래밍은 명령형 프로그래밍 위에 쓴다고 이야기 할 수 있다.

3. 함수형 프로그래밍

홀수 제거하는 코드를 함수형 프로그래밍으로 작성해보자.

function checkForOdd(item){
   return item % 2 === 0;
}

function removeOdd(items){
   return items.filter(checkForOdd);
          //checkForOdd 함수를 filter의 인자로 보냄
}

함수형 프로그래밍에서는 위 처럼 함수를 인자로 보내는 방식을 많이 사용한다.

함수형 프로그래밍함수 중심으로 코드를 적는 방식으로, 선언형 프로그래밍 콘셉트를 유지한다.


💬 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요


객체 지향 프로그래밍과 함수형 프로그래밍 무엇인지 개념을 잡을 수 있어서 좋았다.

🍪 쿠키: Tip! 개발자의 번아웃 대처 방법

  1. 휴식 시간 가지기
  2. 일할 시간 제한하기
  3. 몸을 움직이고(운동) 건강한 음식으로 활력 찾기

❓ 궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.


프로그래밍 패러다임
객체 지향 프로그래밍
함수형 프로그래밍

profile
Always have hope🍀 & constant passion🔥

0개의 댓글