Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back

[TIL] IT 잡학사전 : Day02 of 14 ( #12 ~ #14 )

#book_club
1년 전
585
3

오늘 TIL 3줄 요약

  • 해시함수를 통한 보안 방식

  • 인간이 생각하는 방식과 비슷한 객체 지향 프로그래밍

  • 함수를 활용한 함수형 프로그래밍

TIL (Today I Learned) 날짜

  • 2023. 09. 06. ( 화요일 )

오늘 읽은 범위

  • 04 마당 코딩별 안내서 ― 컴퓨터 공학 편 ②

    • 에피소드 35 비밀번호는 어떻게 저장될까?

    • 에피소드 36 객체 지향 프로그래밍이 뭐죠? ①

    • 에피소드 37 객체 지향 프로그래밍이 뭐죠? ②

    • 에피소드 38 함수형 프로그래밍이 뭐죠?

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

[ 비밀번호 시스템 ]

잘못된 비밀번호 시스템

  1. 데이터베이스에 비밀번호 그대로 저장하기

    • 매우 안 좋은 방법이다.

    • 데이터베이스에 접근할 수 있는 운영자, 개발자 모두 볼 수 있게 된다.

    • 비밀번호 시스템을 구축하는 사람도 비밀번호를 볼 수 있어서는 안된다.

  2. 데이터베이스에 비밀번호 키(Key)로 암호화서 저장하기

    • Key로 저장된 부분을 해제해서 사용하다가, 작업을 마치면 다시 키로 잠그는 방법이다.

    • 이 또한 키(Key)를 잃어버리거나 누군가 그 키를 훔치면 큰 문제가 발생한다.

올바른 비밀번호 시스템 : 해시함수

  • 해시 함수를 사용하면 비밀번호 시스템을 더 안전하게 구현할 수 있다.

  • 시스템 개발자가 데이터베이스에서 출력값을 보더라도 안전하다.

  • 해시 함수는 내가 입력한 값을 무작위 값으로 둔갑 시켜 주는 기능을 한다.

    • (ex) 12345라는 비밀번호를 입력해서 회원 가입을 한다면 해시 함수는 !aef3eZ&^와 같은 값으로 만들어 저장한다.


[ 해시함수 - 3가지 규칙 ]

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

    • 1:1 대응 관계가 유지 된다는 뜻이다.

    • (ex) 12345와 !aef3eZ&^

  2. 입력값이 조금만 바뀌어도 출력값은 크게 변한다.

    • 무작위성을 가진다.

    • (ex) 해시 함수에 12345가 아니라 1234가 입력되면 출력값은 !ae3eZ&* 와 같이 완전히 다른 결과가 나온다.

  3. 반대로 출력값을 입력한다고 입력값이 나오지 않는다.

    • 한 방향이다.


[ 레인보우 테이블 ]

rainbow table

  • 해시 함수도 완벽하지 않다.

  • 레이보우 테이블은 해시 함수가 변경한 값을 원래의 값과 연결한 표이다.

  • 해시 함수를 통과한 값은 레인보두 테이블에서 찾아보면 원래 값을 알 수 있다.

  • 즉, 레이보우 테이블이 훔쳐진다면 다시 큰 문제가 발생한다.



[ 보완책 : 솔트 ( salt ) ]

  • 솔트는 아주 작은 무작위 텍스트다.

  • 12345와 같은 비밀번호에 무작위 텍스트인 솔트를 합쳐서 해시 함수에 통과 시킨다.

  • 그러면 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수 없게 된다.



[ 개체 지향 언어 ( OOP 언어 ) ]

OOP(Object-Oriented Programming)

사람한테 직관적인 것( 물체 )을 프로그래밍 언어로 만든 것이다. 반면, 절차적인 언어는 기계 관점 위주로 돌았다.

(ex) C++, Java

  • 개체 ( Object )

    자료 저장(상태)과 기능을 하나의 개체(Object)에 합침

    • 물체의 개념

    • 오역 때문에 객체라고 주로 부르기도 한다. ( 객체는 주어와 목적어를 말한다. )

  • 클래스 ( Class )

    • 개체는 이 클래스라는 '틀, 설계도'를 통해 완성된다.

    • 클래스는 공통적으로 사용되는 속성이나 메소드(기능)를 미리 만들어 둘 수 있다.

    • 클래스는 중복 사용을 해결하고, 동시에 효율적으로 사용하기 위해 상속 통해 새로운 클래스를 만들 수도 있다.

      (ex) Human, Japaness, Korean 등

  • 가장 널리 쓰이는 프로그래밍 패러다임

    • 사람에게 매우 직관적이다.

    • 미리 만들어 진 여러가지를 재활용하기 때문에 복잡한 프로그램의 구조를 잡기 쉽다.

  • [주의!] OOP언어라고 불리는 것들은 OOP적인 문법을 강제하는 언어라고 생각하자. C 언어를 OOP처럼 사용할 수 있지만, 그렇게 사용하길 컴파일러에서 강제하지 않는다.

[ 함수형 프로그래밍 ]

Functional programming

절차적 언어와 비슷하지만 순수 함수(Pure Function)를 조합하고 프로그램을 만든다. 특징 또한 함수를 순서대로 실행한 결과이다.

  • 절차적 언어처럼 함수를 사용한다.

  • 함수형 프로그래밍은 수학의 함수에 충실해서 대부분 반환형이 존재한다.


명령형 프로그래밍 vs 선언형 프로그래밍 vs 함수형 프로그래밍

  • '명령형 프로그래밍 ( imperative programming )'

    • ''명령형 프로그래밍''은 상태를 바꾸는 것을 강조한다.

    • 원하는 결과 값에 도달하기 위한 과정을 나열한다.

    • 일반적인 프로그래밍이 주로 작성하는 방식이다.


    // 명령형 프로그래밍 - 공백을 ♡로 바꾸기 (JavaScript)
    ​
    function spaceToHear(text)
    {
        let result = "";
        for (let i = 0; i < text.length; i++)
        {
            if (text[i] == " ")
            {
                restult += "♡";
            } 
            else 
            {
                result += text[i];
            }
        }
    }

  • 선언형 프로그래밍 ( declarative programming )

    • '선언형 프로그래밍'은 프로그래밍이 문이 아닌 식이나 선언으로 수행된다.

    • '선언형 프로그래밍'은 원하는 결괏값을 선언한다.


    body { background-color : pink }

  • 함수형 프로그래밍 ( Functional Programming )

    • 함수형 프로그래밍은 선언형 프로그래밍 패러다임을 따르며 함수의 응용을 강조한다.

    • 장단점

      • 장점 : 버그가 발생하기 어려운 구조이다.

      • 단점 : 미리 사용할 함수에 대해서 알고 있어야 한다.

    • [참고] 결국, 모든 선언형 코드(함수형 프로그래밍)은 명령코드 위에 쓰여진다.


    // 선언형 프로그래밍 - 공백을 ♡로 바꾸기 (JavaScript)
    ​
    function spaceToHeart(text)
    {
        return text.replaceAll(" ", "♡");
    }

3 comments