개발자 99% 커뮤니티에서 수다 떨어요!
오늘 TIL 3줄 요약
해시함수를 통한 보안 방식
인간이 생각하는 방식과 비슷한 객체 지향 프로그래밍
함수를 활용한 함수형 프로그래밍
TIL (Today I Learned) 날짜
2023. 09. 06. ( 화요일 )
오늘 읽은 범위
04 마당 코딩별 안내서 ― 컴퓨터 공학 편 ②
에피소드 35 비밀번호는 어떻게 저장될까?
에피소드 36 객체 지향 프로그래밍이 뭐죠? ①
에피소드 37 객체 지향 프로그래밍이 뭐죠? ②
에피소드 38 함수형 프로그래밍이 뭐죠?
데이터베이스에 비밀번호 그대로 저장하기
매우 안 좋은 방법이다.
데이터베이스에 접근할 수 있는 운영자, 개발자 모두 볼 수 있게 된다.
비밀번호 시스템을 구축하는 사람도 비밀번호를 볼 수 있어서는 안된다.
데이터베이스에 비밀번호 키(Key)로 암호화서 저장하기
Key로 저장된 부분을 해제해서 사용하다가, 작업을 마치면 다시 키로 잠그는 방법이다.
이 또한 키(Key)를 잃어버리거나 누군가 그 키를 훔치면 큰 문제가 발생한다.
해시 함수를 사용하면 비밀번호 시스템을 더 안전하게 구현할 수 있다.
시스템 개발자가 데이터베이스에서 출력값을 보더라도 안전하다.
해시 함수는 내가 입력한 값을 무작위 값으로 둔갑 시켜 주는 기능을 한다.
(ex) 12345라는 비밀번호를 입력해서 회원 가입을 한다면 해시 함수는 !aef3eZ&^와 같은 값으로 만들어 저장한다.
[ 해시함수 - 3가지 규칙 ]
동일한 입력값에 대해 동일한 출력값을 가진다.
1:1 대응 관계가 유지 된다는 뜻이다.
(ex) 12345와 !aef3eZ&^
입력값이 조금만 바뀌어도 출력값은 크게 변한다.
무작위성을 가진다.
(ex) 해시 함수에 12345가 아니라 1234가 입력되면 출력값은 !ae3eZ&* 와 같이 완전히 다른 결과가 나온다.
반대로 출력값을 입력한다고 입력값이 나오지 않는다.
한 방향이다.
[ 레인보우 테이블 ]
rainbow table
해시 함수도 완벽하지 않다.
레이보우 테이블은 해시 함수가 변경한 값을 원래의 값과 연결한 표이다.
해시 함수를 통과한 값은 레인보두 테이블에서 찾아보면 원래 값을 알 수 있다.
즉, 레이보우 테이블이 훔쳐진다면 다시 큰 문제가 발생한다.
[ 보완책 : 솔트 ( salt ) ]
솔트는 아주 작은 무작위 텍스트다.
12345와 같은 비밀번호에 무작위 텍스트인 솔트를 합쳐서 해시 함수에 통과 시킨다.
그러면 레인보우 테이블이 있어도 원래 비밀번호를 찾을 수 없게 된다.
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(" ", "♡");
}