보통 웹으로 로그인 폼을 통해 로그인 기능을 구현 할 때 보통의 경우 비밀번호를 그냥 보내고 서버 상에서 검증하게 된다. 하지만 이러한 방법은 패킷만 캡쳐를 하면 비밀번호를 알아낼수 있어서 매우 위험하다. 따라서 다른 여러가지 방법을 통해 비밀번호를 평문(plain-text)로 보내지 않고 다른 방법을 거쳐서 보내게 된다. 그중 하나가 MD5 Hash를 이용한 digest인증 방법이다. 이에 관심이 생겨 위키(http://en.wikipedia.org/wiki/Digest_access_authentication)를 찾아보던 중 재미난 것을 몇개 발견하였다.

일단 HTTP 스킴이 제일 처음 디자인 된 곳은 유럽입자물리연구소인 CERN이다. 그리고 MD5에 대한 보안상 문제점을 제기하는 논문중에 조금 크리티컬 한 것이 우리나라사람이 제 1저자로 쓴 논문(http://eprint.iacr.org/2006/187.pdf)같다. 우왕 신기해라~
CakePHP 후기 Programming/Web 2011. 1. 12. 23:30
일단 몇일동안 CakePHP를 써본 후기를 올린다. 아직 많이 사용 해 본것도 아니고 홈페이지를 다 만든것도 아니지만 일단 조금 아쉬운 점이 있어 올린다.

CakePHP는 유명한 웹 프레임워크인 RoR(Ruby on Rails)의 기능을 본따 php로 만든 것이다. 문제는 php자체가 루비와는 다르게 웹 언어로부터 출발하였고, 프레임워크를 염두하고 만든 것이 아니기 때문에 쓰다 보면 좋을 때도 있지만 좀 귀찮을때도 있다. 그냥 쌩으로 코딩할때는 별 고민없이 프로그래밍한걸 CakePHP내장 함수들을 써서 다듬으려니 꽤나 귀찮다. 특히 디비에 쿼리날릴때 제일 이런 느낌이 많이든다. 원래대로라면 MySQL의 내장함수들과 프로시져를 포함하게 쿼리를 날릴텐데 그걸 전부 php안에서 해야되서 제약이 많아졌다. MySQL의 강력한 기능을 못쓰는 기분. 

게다가 CakePHP만의 강력한 기능들은 ajax를 구현할때는 별로 또다른 강력한 기능을 하지 못한다. 원래 기본적으로 form의 어느 필드가 문제인지 알려주는 validate 기능도 ajax에서는 실제 폼으로 전송하는게 아니니까 내부에서 validate을 하고 결과 에러메세지를 데이터로 전송해야 한다. 물론 미리 validate하였기 때문에 save하는 함수에도 validate을 하지는 말라고 알려줘야 한다. 뭐 그래도 조금은 편하긴 하지만 생각했던것 만큼 엄청난 일을 줄여주거나 하지는 않는것 같다. 관련 기능이 있는 Helper를 쓰면 나을 것 같기도 한데, 기본으로 추가되어 있는게 아니기 때문에 무슨 Helper가 좋은지도 모르겠다. 

또한 다른 문제는 성능이다. 같은 기능을 생으로 구현했을때와 CakePHP를 썻을때 성능차이가 꽤나 많이 난다. 사용자가 매우 없는 상태라 원래는 누르면 바로바로 받아진 ajax데이터가 꽤나 오래건린다. 

하지만 좋은 점도 많다. 일단 마음에 든건 MVC패턴과 레이아웃 기능, 그리고 validate기능이다. 딱 이정도 기능만 있고 빠른 프레임워크가 있으면 많이 좋을 것 같다. 아마 Codeigniter 가 이런데 좋은 것 같은데 알아봐야겠다.


프로그래밍 언어는 크게 두가지 종류로 나뉜다. 그중 하나는 명령형 프로그래밍 언어(imperative programming language, http://en.wikipedia.org/wiki/Imperative_programming) 이고 다른 하나는 함수형 프로그래밍 언어(functional programming language, http://en.wikipedia.org/wiki/Functional_programming)이다. 사실 이것은 분류의 한가지 방법일뿐 객체지향을 중요하게 생각하는 사람이면 OOP/ Non OOP로 나눌 수도 있고, 이런 방식으로 나누면 stack을 이용하는 forth나 논리형 프로그램언어인 prolog는 자리가 애매해 지기도 한다. 하지만 내가 이러한 방식으로 프로그래밍 언어를 나눈 것은 이러한 분류방법이 컴퓨터 모델에 대한 가장 큰 두가지 방식과 일치하기 때문이다. 


컴퓨터는 무엇을 계산가능할까? 또 어떤 종류의 문제들을 빨리 계산할수 있을 것인가? 이러한 의문에 답해주는 것이 계산이론(Theory of computation, http://en.wikipedia.org/wiki/Computational_theory)이다. 이것은 논리학을 가지고 컴퓨터가 어느것을 계산할수 있는지와 없는지를 알려준다. 이 이론을 전개하는 방식은 여러가지가 있는데, 그중 대표적인 두가지 방식이 튜링머신(Turing Machine, http://en.wikipedia.org/wiki/Turing_machine)과 람다대수(Lambda calculus, http://en.wikipedia.org/wiki/Lambda_calculus) 이다. 


튜링머신은 앤런 튜링이라는 사람이 만든 컴퓨터의 모델로 기본적으로 무한한 메모리와 몇가지 명령어로 계산하는 컴퓨터의 수학적 모델이다. 너무 자세히 들어가면 복잡해 지니 기본적인 개념만 살펴보자. 기본적으로 튜링머신은 자신의 상태, 무한한 테이프, 다음에 읽을 테이프의 위치 그리고 입력과 상태에 따라서 다음 상태를 알려주는 상태표로 결정된다. 컴퓨터 구조에 익숙한 사람이라면 기본적인 폰 노이만 모델을 떠올릴 수 있을 것이다. 현대 컴퓨터로는 상태는 CPU의 register 값들, 테이프는 메모리, 다음에 읽을 위치는 PC, 상태전이표는 CPU명령어(어셈블리어 명령)에 대응한다. 이때 가장 중요한 특징은 순차적으고 메모리를 사용한다는 것이다. 이것은 명령형 프로그래밍 언어의 모델이된다. 즉, 메모리는 각각의 변수에 대응되고 순차적으로 상태를 바꾸는 것이 변수들의 값을 바꾸고 반복문과 조건문을 이용하는 것이 된다. 


그렇다면 람다대수는 어떻게 되는 것인가? 람다대수도 튜링머신과 완전히 동등하게 컴퓨터를 묘사한다. 하지만 람다대수에는 메모리나 상태같은 것이 없다. 대신 함수를 통해 그것을 나타낸다. 또한 반복문 대신 재귀호출을 통해 연속된 것을 표현한다. 또한 함수는 가장 기본적인 형태로 함수가 함수의 인자로 들어가는 것이 매우 자연스럽다. 이것들이 가장 큰 특징이자 다른 점이다. 자세한 것을 실제 프로그래밍을 통해 알아보도록 하자.


하지만 보통의 프로그래밍 언어에서 이러한 두가지 방법이 완전히 구분되지는 않는다. 명령형 프로그래밍 언어라고 하더라도 어느정도 함수형 언어의 기능을 가지고 있고 함수형 프로그래밍 언어라고 하더라도 어느정도는 멍령형의 특징을 가지게 된다. 특히나 우리가 사용하는 컴퓨터는 튜링머신에 기반을 둔 모델로 만들어졌기 때문에 함수형 프로그래밍언어도 실행될때의 모습은 순차적인 명령형 프로그램을 수 밖에 없다. 


다음부터는 Python과 Caml 프로그래밍 언어를 통해 두개의 다른 프로그래밍 언어들의 특징을 알아보도록 하자.