📖 IT 5분 잡학사전(Ep. 35~38)
오늘 TIL 3줄 요약
- 비밀번호 데이터베이스 저장과 보안 방법
- 프로그램밍 패러다임, 객체 지향 프로그래밍(클래스, 상속)
- 선언, 명령형과 함수형 프로그래밍
TIL (Today I Learned) 날짜
2024.08.06
오늘 읽은 범위
- Ep.35 비밀번호는 어떻게 저장될까?
- Ep.36 객체 지향 프로그래밍이 뭐죠?①
- Ep.37 객체 지향 프로그래밍이 뭐죠?②
- Ep.38 함수형 프로그래밍이 뭐죠?
책에서 기억하고 싶은 내용
프로그래밍 패러다임! 에 대한건 잘 몰랐어서!
Ep.35 비밀번호는 어떻게 저장될까?
비밀번호 시스템 구현 안좋은 예시
1. 비밀번호를 데이터베이스에 그대로 저장한다.
⇒ 운영자, 개발자도 모두 볼 수 없어야 한다!
2. 데이터베이스 자체를 암호화해서 아무도 볼 수 없게 만든 후 비밀번호를 저장한다.
사용자는 회사에서 주는 키(key)로 데이터베이스를 해제한 후 로그인한다.
키로 자신의 비밀번호가 저장된 부분을 해제하고 입력한 비밀번호와 일치하면 로그인 되는 방식이다.
로그인이 되면 다시 데이터베이스는 암호화된다.
⇒ 만약 키를 잃어버리거나 키를 도난당하면 문제가 생긴다!
비밀번호 시스템 구현에 좋은 예시
1. 해시 함수 사용
해시 함수는 비밀번호 데이터베이스 앞에서 내가 입력한 값을 무작위 해시값으로 변형시켜 저장시킨다.
해시 함수의 동작 3가지
- 동일한 입력값에 대해 동일한 출력값을 가진다.
(한 비밀번호에 일대일 대응되는 특정 해시값이 생성됨) - 입력값이 살짝만 바뀌어도 출력값은 엄청나게 바뀐다.
- 반대로 해시값을 입력한다고 해도 비밀번호가 나오진 않는다.
해시 함수를 통한 비밀번호 암호화 구현에서는 사실 해시값과 실제 비밀번호가 연결된 레인보우 테이블(rainbow table)이 존재하기에 이게 털리면 다시 위험해지는 단점이 있다.
2. 해시함수 + 솔트 사용
솔트를 사용하지 않을 경우:
- 레인보우 테이블에는 미리 계산된 비밀번호와 해시값 쌍이 저장돼 있다.
- 해시값을 얻었을 때, 레인보우 테이블에서 그 해시값에 대응하는 비밀번호를 쉽게 찾을 수 있어 위험하다.
솔트를 사용할 경우:
- 각 비밀번호에 대해 랜덤한 고유 솔트를 추가하고 해시값을 생성한다.
- 예를 들어, 비밀번호 "password123"에 솔트 "abc"가 추가되면 "password123abc"라는 문자열로 해시값을 생성한다.
- 이렇게 하면 같은 비밀번호라도 솔트마다 각기 다른 해시값이 생성된다.
솔트의 강점
- 공격자는 데이터베이스에 저장된 해시값을 얻어도, 그 해시값이 어떤 솔트와 비밀번호 조합으로 생성됐는지 알 수 없다.
- 따라서 공격자는 모든 가능한 솔트와 비밀번호 조합을 시도해서 각기 다른 해시값을 계산해야만 비밀번호를 추측할 수 있다.
공격의 현실적 어려움:
- 솔트가 충분히 랜덤하고 길다면, 모든 가능한 솔트와 비밀번호 조합을 계산하는 것은 엄청난 시간이 소요되며, 이는 사실상 레인보우 테이블을 사용하는 공격을 불가능하게 만든다.
Ep.36 객체 지향 프로그래밍이 뭐죠?①
프로그래밍 패러다임(Programming Paradigm): 프로그래밍을 할 때의 관점, 방식, 사고의 틀
https://jisung-rithm.tistory.com/99
프로그래밍 패러다임(Programming Paradigm)
프로그래밍 패러다임은 프로그래밍 언어로 프로그램을 구성하고 작성하는 방식을 정의하는 개념이다.프로그래밍을 할 때, 정해진 사고의 틀 안에서 프로그래밍을 할 수 있게 만든다. 각 패러
jisung-rithm.tistory.com
클래스: 속성들은 같지만 데이터는 각기 다른 다양한 인스턴스(객체)들을 만들어내기 위한 여러 속성(데이터)과 메서드(동작)들로 정의된 하나의 큰 틀, 공장이다.
Ep.37 객체 지향 프로그래밍이 뭐죠?②
상속: 비슷한 유형의 클래스들을 여러개 만들 때, 만일 중복된 속성들이 존재한다면 이 클래스들을 하나의 큰 부모 클래스로 묶어서 중복됐던 속성을 만들고 이 속성들을 부모 클래스에게서 상속받게 만들어 코드의 재사용성을 높이고, 중복을 제거해 코드를 더 효율적으로 만든다.
상속을 사용하면 유지보수에 더 용이해진다.
예: 부모 클래스인 Human클래스와 자식 클래스인 아기, 청소년, 성인 클래스 (사람 요소는 중복으로 상속 시킴)
Ep.38 함수형 프로그래밍이 뭐죠?
명령형 프로그래밍
원하는 결과값에 어떻게 도달하는지 방식을 설명, 명령하는 방식의 프로그래밍
예: C언어
선언형 프로그래밍
원하는 결과값을 선언하는 프로그래밍
예: CSS
사실상 선언형 프로그래밍을 하려면 명령형 프로그래밍으로 작성된 코드(함수)를 불러와서 실행시키도록 하는 것이기 때문에 명령형 위에 선언형 프로그래밍이 있다고 볼 수 있다.
장점
명령형 프로그래밍: 프로그램을 더 세밀하게 개발자가 원하는대로 조율할 수 있다.
선언형 프로그래밍: 결과 중심으로 코드를 작성하니 실수도 적고, 동료가 코드를 이해하기도 쉽다.
단점
명령형 프로그래밍: 세세한 작업 방법을 다 작성하니 개발자가 실수하거나 동료가 작성한 코드를 알아보기 힘들 수 있다.
선언형 프로그래밍: 이미 작성된 코드를 가져와 결과를 적용하다보니 원하는 형태의 결과가 아니라면 사용할 수 없어 명령형으로 바뀌어야 한다.
함수형 프로그래밍
함수 중심으로 코드를 적는 방식의 프로그래밍
함수 인자로 함수를 적는 등의 형태이다.
함수 중심이니 선언형 프로그래밍의 형태라고 볼 수 있다.
버그가 발생하기 어려운 구조라 개발자에게 매우 유용하다.
지원 언어: Java, Javascript, Python 등
오늘 읽은 소감은?
열심히 정리하며 꾸준히 한발자국씩 나아감을 느끼게 된다.
객체지향에서 클래스나 상속 부분을 읽으며 느낀건데 개발자는 노가다를 싫어하고 효율적인걸 좋아한다.
사실 효율적인게 단순히 좋아서만 만드는게 아니다. 실제로 프로그램을 돌리고 상용화 했을 때, 효율적이고 처리속도가 빨라야 무조건 좋기 때문이다. 사용자 입장에서도 개발자 입장에서도 말이다.
어쩌면 개발자들은 더 효율적이고 단순하고 빠르고 편리한 길을 찾고 만들어내는 사람들일지도 모른다.
나는 명령형 프로그래밍과 같은 사고를 가진 사람같다. 그래서 뭔가 하면 더 느린게 단점인데 하면 세밀하고 더 완성도 있게 해내기 때문이다. 근데 사실 인생에선 시간도 중요해서 걱정이 되고 막상 시간이 부족하게 되면 조바심이 나기에 막판에 실수하거나 급조할 수 있으니 나를 잘 컨트롤 해야한다.
개발자는 이미 명령형으로 만들어진 코드가 쓸만하다면 그대로 가져와서 선언형 프로그래밍을 할 것이다.
그러다가 특정 부분에서 마음에 안드는 부분이 있다면 만들거나 고쳐 쓸 것이다. 그게 가장 효율적이기 때문이다.
그러니까 나도 마냥 명령형만 고집할게 아니라 목표가 정해졌으면 처음부터 끝까지 완성도있게 다 스스로 만들지 말고 다른 사람들과 함께 협력하기도 하고 나 혼자 해야하는 거라면 어느정도 선언형적인 요소들도 끌어와서 만들며 시간을 아낄 줄 아는것도 중요한 것 같다. 아무튼 잘 나아가서 결과가 좋으면 좋은거다!