유정월드 2023. 2. 28. 14:54

DAY 12일차

 

오늘 읽을 내용 : 에피소드 35~38

 

<책에서 기억하고 싶은 내용>

[비밀번호는 어떻게 저장될까?]

- 비밀번호 시스템의 잘못된 예 2가지

: 데이터 베이스에 그래도 저장하는 방법은 잘못된 방법이다. 이렇게 저장하면 데이터베이스에 접근 가능한 운영자, 개발자 모두 볼 수 있다. 그래서 어떤 회사들은 데이터베이스 자체를 암호화해서 아무도 볼 수 없게 만든 후에 비밀번호를 저장한다. 사용자는 회사에서 주는 키(key)로 데이터베이스를 헤제한 후 로그인한다. 키로 자신의 번호가 저장된 부분을 해제하고 나서 입력한 비밀번호와 대조해서 맞으면 로그인 되는 것이다. 로그인을 마치면 다시 데이터베이스의 비밀번호 부분을 잠근다. 하지만 키를 잃어버리거나 누군가 그 키를 훔치면 큰일이라 이 방법도 좋은 방법은 아닌 것이다.

 

- 괜찮은 비밀번호 시스템의 예: 해시 함수

: 해시 함수는 비밀번호 데이터베이스 앞에 살고 있는 마법사 같은 녀석인데, 내가 입력한 값을 무작위 값으로 둔갑시켜 주는 녀석이다. 예를 들어 내가 12345라고 비밀번호를 입력해서 회원가입하면 해시 함수가 !aeff3eZ&^와 같은 값으로 무작위로 만들어 저장하는 것이다.

 

- 해시 함수의 작동 원리

<규칙1. 동일한 입력값에 대해 동일한 출력값을 가진다>

: 아까 예를 들었던 12345와 !aeff3eZ&^의 일대일 대응 관계는 계속 유지된다.

 

<규칙2. 입력값이 아주 살짝만 바뀌어도 출력값은 엄청나게 크게 바뀐다.>

예를들어 해시 함수에 12345가 아니라 1234가 입력되면 출력 값은 !aeff3eZ&^*와 같이 약간만 달라지는 것이 아니라 5a1ZKer!처럼 완전히 다른 결과가 나온다. 해시 함수는 상상할 수 없을 정도의 무작위성을 가지고 있는 것이다.

 

<규칙3. 반대로 입력한다고 해서 원래 값이 나오지 않는다.>

 : 해시 함수는 반대로 입력하면 원래 값이 나오거나 하지 않는다. 한쪽 방향으로만 설계된 함수이기 때문이다.

 

- 해시 함수도 완벽하지 않다, 레인보우 테이블

: 레인보우 테이블은 해시 함수가 변경한 값을 원래의 값과 연결한 표이다. 사실 해시 함수를 통과한 값은 레인보우 테이블에서 찾아보면 원래 값을 알 수 있다. 그래서 레인보우 테이블이 털리면 다시 위험해 진다.

 

- 최종병기, 솔트

: 솔트는 아주 조그마한 무작위 텍스트이다. 아까 12345와 같은 비밀번호를 무작위 텍스트인 솔트와 함쳐서 해시 함수에 통과시키는 것이다. 그러면 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수 없을 것이다.

 

[객체 지향 프로그래밍]

- 프로그래밍 패러다임이란?

: 프로그래머가 프로그래밍을 할 때의 관점, 방식 이런 것들을 말한다. 프로그래밍을 하는 사고의 틀이라고 생각하면 좋다. 프로그래밍 언어는 이런 프로그래밍 패러다임을 하나 또는 하나 이상을 지원한다. 이를테면 자바는 객체 지향 프로그래밍, 함수형 프로그래밍을 지원한다.

: 대표적인 프로그래밍 패러다임으로는 절차 지향 프로그래밍, 객체 지향 프로그래밍, 함수형 프로그래밍이 있다.

 

- 게임 만드는 과정으로 이해하는 객체 지향 프로그래밍

: 게임 플레이어는 닉네임, 체력, 스킬 등의 데이터를 가지고 있다. 보통 게임에서는 플레이어가 여러명인데 하나의 플레이어 각각에게 데이터를 주는 방법은 비효율적이다. 플레이어는 모두 name, health, skill이라는 같은 속성을 가지고 있다. 

: 클래스의 등장 - 쉽게 말해 우리가 재료만 공장에 넣어주면 나머지 코드는 공장이 알아서 찍는 것이다. 예를 들어 공장에 name, health, xp, skill의 값만 넣으면 나머지 코드는 공장이 찍는 것이다. 바로 이런 자연스러운 생각이 객체 지향 프로그래밍의 클래스(class)라는 개념이다. 

실제로 클래스는 속성은 같지만 데이터는 다른 녀석들을 위한 공장 같은 것이다. 

 

- 이름 그대로 상속해주는 개념, 상속

: 상속은 말 그대로 상속이다. 

 

[함수형프로그래밍]

: 버그가 발생하기 어려운 구조라서 개발자에게 매우 유용하다.

 

- 선언형, 명령형 프로그래밍의 차이

*선언형 프로그램이 샌드위치를 만들 때

: BLT샌드위치를 만들어줘! => 선언형 프로그래밍은 원하는 결과값을 선언한다.

반면 명령형 프로그래밍에서는 그냥 샌드위치를 만들어 달라고 하지 않는다.

 

* 명령형 프로그램

1) 토스트 빵 2개를 꺼내서 구워라

2) 양상추 2장 씻고, 토마토 2조각, 구운 베이컨 3개를 준비해라

3) 1)의 토스트 빵 1위에 2)의 재료를 쌓은 다음, 나머지 토스트 빵 1개로 덮어라!

=> 명령형 프로그래밍은 원하는 결과값에 어떻게 도달하는지 선언한다. 샌드위치를 만드는 단계를 다 알려주는 것이다. 

 

- 선언형 프로그래밍의 대표적인 예는 CSS이다.