개발자 99% 커뮤니티에서 수다 떨어요!
오늘 TIL 3줄 요약
비밀번호를 안전하게 하기 위해선 해시와 솔팅을 알자.
객체 지향 프로그램은 코드를 효율적으로 사용할 수 있도록 해준다.
함수형 프로그램은 버그를 최소화 해주는 방법.
TIL (Today I Learned) 날짜
2023.09.05
오늘 읽은 범위
에피소드35. 비밀번호는 어떻게 저장될까?
에피소드36. 객체 지향 프로그래밍이 뭐죠? 1
에피소드37. 객체 지향 프로그래밍이 뭐죠? 2
에피소드38. 함수형 프로그래밍이 뭐죠?
책에서 기억하고 싶은 내용을 써보세요.
잘못된 비밀번호 시스템 2가지
데이터베이스에 그대로 저장한다 (오마이갓)
저장한 데이터베이스를 자체 암호화해서 사용자는 키(key)를 가지고 비밀번호를 해제 잠금하여 사용할 수 있다. -> 키를 잃어버리거나 훔치면? 위험
효과적인 비밀번호 시스템을 위한 해시함수의 동작법
동일한 입력값에 대해 동일한 출력값을 가진다
입력값이 아주 살짝만 바뀌어도 출력값은 엄청나게 바뀐다
반대로 입력한다고 해서 원래 값이 나오지 않는다
레인보우 테이블: 해시함수가 변경한 값을 원래 값과 연결한 표. 해시 함수가 완벽하지 않은 이유.
솔트(salt): 무작위 텍스트. 비밀번호 + 솔트로 해시 함수를 통과 시킨다. 레인보우 테이블이 가지는 위험을 상쇄할 수 있다.
프로그래밍 패러다임(programming paradigm): 프로그래머가 프로그래밍을 할 때의 관점, 방식 등을 말한다. 프로그래밍을 하는 사고의 틀.
프로그래밍 언어는 이런 프로그래밍 패러다임을 하나 또는 하나 이상을 지원한다. Ex: 자바-객체 지향/함수형 프로그래밍
프로그래밍 패러다임의 대표 종류: 절차 지향 프로그래밍(명령형), 객체 지향 프로그래밍(명령형), 함수형 프로그래밍(선언형).
선언형 프로그래밍과 명령형 프로그래밍
선언형: 원하는 결괏값을 선언한다. (ex.css)
명령형: 원하는 결괏값에 어떻게 도달하는지 선언한다.
모든 선언형 프로그래밍은 명령형 프로그래밍 위에 쓴다고 이야기 할 수도 있다.
명령형 프로그래밍은 할 일을 세세하게 지시할 수 있는 대신 개발자가 실수하기 쉽고, 작성한 코드를 다른 동료가 이해하기 어렵다는 특징이 있다.
선언형 프로그래밍은 결과 중심으로 코드를 작성해 실수도 적고 동료가 코드를 이해하기도 쉽다.
객체 지향 프로그래밍
클래스: 같은 작업을 여러번 반복해야할 때 하나의 클래스를 만들어 필요한 속성들을 모두 구성해준다. 클래스 속성은 같지만 데이터는 다르게.
상속: 클래스의 중복 되는 부분을 물려주는 행위. 새로운 속성만 추가하고 같은 속성은 ‘물려받아’ 중복을 피하고 효율적으로 코드할 수 있도록 해주는 부분.
함수형 프로그래밍
‘버그가 발생하기 어려운 구조’라서 개발자에게 매우 유용하다.
자바, 자바스크립트, 파이썬 등이 함수형 프로그램을 지원한다.
오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
지난 번 자료구조때 알게 된 해시 함수가 또다시 등장했다! 정말 마법같은 매력을 가진 함수다… 물론 비밀번호 생성에 있어 단점도 가지고 있었지만, 해시함수가 가지는 능력이 큰 것 같다. 해시 함수는 내부가 어떻게 생겼는지 어떤식으로 짜여져있는지 좀 더 세세하게 살펴보고 싶다.
생각해보면 예전에 웹에서 ‘비밀번호 찾기’를 하면 기존에 내가 가지고 있던 비밀번호를 찾을 수 있는 경우가 있었다. 지금은 오히려 찾기보다 ‘비밀번호 재설정’이라는 옵션이 더 많지만. 그럼 예전에 비밀번호 찾기 같은 경우에는 데이터베이스 안에 그대로 비밀번호가 저장돼 있었던 걸까 ? ? 그렇다면 굉장히 보안이 굉장히 취약했겠다는 생각이든다….
비밀번호 저장에 대해서 좀 더 찾다보니 해시 함수로 생성하는 암호화된 메시지를 ‘다이제스트’라고 한다. 단방향으로 복호화(암호를 풀어내는 것)할 수 없는 방법이라고. 그래서 비밀번호 찾기보다 비밀번호 재설정이 필요한 거고 운영자들도 유저의 비밀번호를 알 수 없게 된다. 단방향 해시 함수의 대표적인 예가 ‘SHA-256’이라고 하는데 ssk-keygen할때 맨날 보던 애가 이것이였구나!!! 하는 깨달음을 얻었다. (조금만 더 궁금해하고 검색해봤으면 더 빨리 알았을텐데 이걸 이렇게 알게되네)
솔트는 바이트 단위의 랜덤 문자열이라고 한다. 솔트를 추가하여 다이제스트를 하는 것을 솔팅(salting)이라고 부른다.
비밀번호 저장법에 찾다보니, 책에서 어려운 단어를 쓰지 않고 최대한 쉽게 설명하려고 한 노력이 보이는 것 같다. (이것 역시 파인만 설명기법인가!!! ㅎㅎ 니꼴라스 덕분에 파인만을 알게 됐어요. 누가 존경하는 인물이 누구냐고 물으면 대답하기가 좀 어려웠는데 파인만을 알고 영상을 다 보면서 파인만에 대한 존경심에 빠져버렸습니다 ㅎㅎ) velog 글 중에 하나를 검색해 많이 쓰이는 단어들과 함께 한번 더 내용을 새롭게 정리해볼 수 있었다.
왜인지 알 수 없으나 명령형과 선언형을 헷갈리지 않기 위해 무수히 노력을 하고 있다. 개인적으로 명령형이라는 말이 더 ‘원하는 이걸 바로 줘!!!’라고 과정없이 직설적인 느낌이라서 선언형이랑 자꾸 헷갈리는 것 같다.😅
개인적인 생각인데 배우는 단계에서 이 명령형이 코드가 도움이 더 될 수도 있지 않을까? (물론 코드가 클린할때 ^^) 선언형 코드일때는 결과물만 보기 때문에 사용에는 어려움이 없겠지만, 배울때는 속을 들여다볼 수 있고 어떻게 작동하는지를 보는게 초반에 코드를 이해할 때 도움이 많이 될 것 같다. 그리고 나서 선언형을 쓰면 이 선언형이 뒤에서는 어떻게 작동하고 있는지 알 수 있으니까…
프로그래밍 패러다임 종류를 이해하기 위한 도식표
절차 지향 프로그래밍(Procedure Oriented Programming;POP)은 여기 설명되지 않아 찾아봤더니 '한줄씩 처리하는 프로그래밍'을 말한다고 한다. 이 velog에서 한 코드를 절차 지향 프로그래밍과 객체 지향 프로그래밍으로 각각 설명해 줘 이해하기 쉬웠다. (관점 지향 프로그래밍이라는 것도 있었다...!) 둘의 차이는 절차 지향은 실행 순서 중심, 객체 지향은 객체들의 속성과 종류가 중심이다. C를 절차 지향, C++을 객체 지향으로 이해하면 될 것 같다.
논리형 프로그래밍은 논리 문장을 이용하여 프로그램을 표현하고 계산을 수행하는 개념에 기반을 둔다고 한다.
논리형 프로그래밍을 찾다가 위키페디아에 있는 프로그래밍 패러다임을 보게됐는데 종류가 장난이 아니구나... 한국어로 된 페이지도 있는데 대부분 많이 찾는 것만 번역돼 링크가 달려있고, 그렇지 않은 것들도 많아 클릭하면 편집기로 넘어간다. 이론이니 책에서 설명된 것 보다 더 많을거라 예상은 했지만 이정도일 줄이야...🫣
번아웃 이야기가 나왔는데, 정말 공감한다. 그리고 이 균형을 찾는게 정말 쉽지 않은 것 같다. 일은 아니었지만 학교 과제 때문에 정말 힘들었다. 중간에 쉴 틈도 없이.. 그래서 결국 과정을 다 마쳤을때는 코드를 보기도 싫은 지경이 돼서 몇달간 다른 책만 주구장창 읽고 코드는 손에도 안잡혔다. 지금은 지난 이야기지만 균형이라는 게 정말 쉽지 않은 것 같다. 그리고 그 균형을 맞춘다 하더라도 조금씩 다른게 변형하는 것도 나한테는 필요한 것 같았다. 사람들마다 정해진 루틴안에서 업무와 사적인 일을 하는 것에 안정감을 가지지만, 나 같은 경우에는 주기적으로 그 루틴을 바꿔주는 것도 필요한 타입이다. 계속 반복되면 오히려 반복되는 루틴 속 일들이 지루하게 느껴지기 때문에.. 크진 않더라도 균형을 잡는 루틴을 일정 주기마다 바꿔주는게 좋다고 생각이 들었다. 그리고 프로그래밍 하는 게 엉덩이로 하는 작업인만큼 몸을 움직여주는 활동도 꼭 필요한 것 같다. 안그러면 체력 떨어지는 걸 느끼는 건 기본이고 몸이 자꾸 경고를 한다 ㅠㅠ
궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.
솔트는 왜 솔트라고 부르는 것일까… 왜 하필 소금인가… 라고 하면서 찾아보다가 솔트 위키페디아 에서 솔팅을 했을때와 아닐때를 비교해놓은 테이블 덕분에 더 이해가 잘 갔다. 하지만 왜 여전히 ‘솔트’인지는 못찾아서 좀 더 찾아보니 한가지가 아닌 썰이 있는 것 같다ㅎㅎ 스택오버플로우 에서 찾은 건데 스레드에 보면 1)고대에 우물이나 농지가 덜 적합하게 소금을 뿌리던 전쟁에서 (비밀번호를 쉽게 찾지 못하게?) 비롯됐다 2) 식사에 소금을 추가하는 것과 마찬가지로 비밀번호에 무언가를 추가하기 위함이다. 3) “광산에 소금을 뿌리는 것”(salting a mine)과 연관돼 처음으로 책에 등장했다. 를 이은 다양한 썰들이 있는데 어떤것도 오피셜하진 않은 것 같다. 3번은 저기서 더 설명이 없어서 이해를 잘 못하겠지만, 1번 2번으로도 충분히 비밀번호 해독을 어렵게 하기 위한 의미로 ‘소금’을 썼다는 것이 귀엽다…
읽다보니 궁금한게.. 함수형 프로그래밍이 버그가 발생하기 어려운 구조라고 했는데, 결국 함수형으로 코드를 작성하기 위해서는 선언형으로 만들어진 함수를 사용하는 것이지 않나? 빌트인 함수를 사용하는 것이 아니라면 결국 그 함수를 만드는 것도 프로그래머 개인일텐데 이런걸 생각하니 버그가 발생하기 어려운 구조라고 하는 부분이 조금 이해가 잘 되지 않는다. 여러 함수를 명령형으로 만드는 것에 비해 버그가 발생하기 어려운 구조라고 비교적으로 이야기 해 놓으신 걸까?
책 내용과 관련 없지만... 글을 쓰고 나서 글쓰기 버튼을 누르고 글이 생성되면 생성 되자마자 바로 눈표시 👁️🗨️에 이미 카운팅이 올라가 있다(!) 왜그런걸까?? 그때그때 다르긴 한데 어떨땐 5, 이번에는 7이었다!! 글이 생성되자마자 7명 (내가 본것도 카운팅 되는 것 같은데 그럼 6명?)이 본것인가!!
오늘 읽은 다른사람의 TIL
jihyun.an님의 틸 요약 무슨일… ㅋㅋ 틸요약을 저렇게 밈으로 해놓으니 정말 참신했습니다! 저것은 정성이 없으면 할 수 없는 틸입니다…ㅋㅋ 특히 상속을 저렇게 색상 혼합으로 표현하니 이해가 더 쉽네요. 나중에 저도 설명할 때 써먹어봐야겠습니다 ㅎㅎ 머리를 깨웠으니 코딩하러 가야겠다는 마지막 말에 코딩하러 가지 않고 집안일 하러 가기로 예정된 저에게 조금 양심을 가책까지 느끼게 하는 틸입니다…(ㅋㅋ)