기억보다 기록을

[cs50] http, 신뢰모델 본문

CS/cs50

[cs50] http, 신뢰모델

juyeong 2022. 5. 21. 07:41
반응형

HTTP

HTTP(Hypertext Transfer Protocol)은 웹 브라우저가 웹 서버와 대화하기 위한 프로토콜입니다. 사용자가 웹 페이지를 방문하려 할 때, 그들의 웹 브라우저(클라이언트)는 웹 서버에 웹 페이지의 내용을 요청해야 합니다. 웹 서버는 그 요청에 응답하기 위해 요청을 해석하고, 요청된 페이지를 클라이언트에게 돌려보냅니다. HTTP는 이 과정을 용이하게 해주며, 요청을 보내고 받는 표준적인 방법을 정해줍니다.

 

 

GET과 POST 요청

사용자가 웹 브라우저에 URL을 입력해 웹 페이지를 요청하면, 웹 브라우저는 GET 요청이라는 특정한 유형의 HTTP 요청을
보냅니다. GET 요청은 단어 GET으로 시작되고 GET 뒤에는 요청 URI를 써주는데, 이것은 사용자가 요청한 웹 페이지의 경로를 나타냅니다. URI는 Uniform Resource Identifier의 약자입니다. / 웹 페이지의 최상위 경로를 나타냅니다. 여러분이 URL을 입력할 때 google.com/ 이나 facebook.com/ 처럼 / 뒤에 아무것도 명시하지 않는 것은 그 웹 페이지의 최 상위 경로임을 뜻합니다.

GET / HTTP / 1.1
Host: www.google.com

1행의 GET 요청은 요청이 사용하고 있는 HTTP 프로토콜의 버전과 함께 끝납니다. HTTP 프로토콜 버전은 일반적으로 1.1입니다. 2행은 호스트를 명시합니다. 호스트는 사용자가 웹 페이지를 요청할 때의 도메인 이름입니다.

웹 브라우저는 POST 요청이라는 다른 유형의 HTTP 요청을 보낼 수 있습니다. POST요청은 사용자가 온라인 폼에 데이터를 입력하고 웹 서버로 데이터를 전송할 때 사용됩니다.

 

 

상태코드

웹 서버가 클라이언트로부터 HTTP 요청을 받을 때, 서버는 클라이언트로 응답을 돌려보내야 합니다. 예를 들어, 클라이언트가 웹 페이지를 요청하면 서버는 웹 페이지의 내용을 돌려보내야 합니다.

HTTP / 1.1 200 OK
Content-Type: text/html

서버는 클라이언트에게 요청의 결과를 나타내는 상태 코드를 함께 보내주면서 응답합니다. 서버에 사용자가 찾는 페이지가 있고 성공적으로 응답할 수 있으면, 서버는 상태 코드 200을 보냅니다. 요청이 성공적으로 처리되었다는 의미입니다. 반면, 사용자가 웹 서버에 존재하지 않는 페이지를 요청할 경우, 서버는 상태 코드 404와 함께 응답합니다. 찾을 수 없다는 의미입니다. 여러분이 웹을 검색하다가 404 오류를 보았던 이유입니다. 다른 유형의 오류 역시 상태 코드로 표현됩니다. 사용자가 접근 권한을 갖고 있지 않은 웹 페이지에 접근하려고 시도한다면, 웹 서버는 상태 코드 403과 함께 응답할 것입니다. 금지됨이라는 의미입니다. 사용자의 요청을 처리하는 중에 웹 서버에 오류가 발생했다면, 서버는 종종 상태 코드 500과 함께 응답할 것입니다. 내부 서버 오류라는 뜻입니다.

 

 

 


신뢰 모델(Trust Model)

사용자가 인터넷에서 소프트웨어를 다운로드할 때, 그 소프트웨어에 악성 코드가 없다는 커다란 신뢰가 필요합니다. 컴퓨터에 다운로드하는 소프트웨어가 여러분 컴퓨터에 있는 모든 것을 삭제할 수도 있기 때문입니다. 하지만, 우린 여전히 우리가 다운로드하는 소프트웨어가 안전하다고 믿습니다. 이것이 신뢰 모델의 기본입니다.

 

 

백도어(Back Door)

	if((strcmp(username, "rob") == 0 && 
	  strcmp(password, "thisiscs50") == 0) || 
	(strcmp(username, "tommy") == 0 && 
	  strcmp(password, "i<3javascript") == 0))
	{
		printf("Success!! You now have access.\n");		
	}
	else if(strcmp(username, "hacker") == 0 &&
	  strcmp(password, "LOLihackedyou") == 0)
	{
		printf("Hacked!! You now have access.\n");
	}
	else
	{
		printf("Inavalid login.\n");
	}

<코드 1>

<코드 1>은 사용자 이름과 비밀번호를 확인하여 사용자 계정 자격이 유효한지 확인하는 가상의 로그인 프로그램입니다. 로그인 프로그램들은 1행부터 7행과 비슷한 방법으로 사용자 이름과 비밀번호를 데이터베이스에 들어있는 것과 비교합니다. strcmp는 두 인자(문자열)가 동일한지 비교하는 함수입니다.

사용자 이름과 비밀번호가 맞는지 확인한 후에 시스템에 대한 액세스 권한을 부여하는 또다른 방법이 쓰여진 코드가 8행(else if)부터 12행에 있습니다. 사용자들이 원래 시스템에 접속하는 방법과는 다른 비정상적인 수단으로 시스템에 접속하는 방법을 백도어(Backdoor)라고 부릅니다.

이 로그인 프로그램의 코드를 읽는 사용자는 시스템에 백도어가 있다는 것을 알아차릴 수 있지만 대부분의 사용자는 프로그램이 컴파일 되기 전의 프로그램 코드를 볼 수 없습니다.

 

 

컴파일러 내부의 익스플로잇(Exploit)

프로그램을 다운로드하기 전에 프로그램의 코드를 볼 수 있고, 그 코드에 악성 코드나 백도어가 없어 보인다고 해도 프로그램 자체가 안전한 것은 아닙니다. 소스 코드를 오브젝트 코드로 변환시키는 프로그램인 컴파일러가 익스플로잇(exploit)의 원천일 가능성이 있습니다. 예를 들어 컴파일러는 백도어가 없는 로그인 프로그램에 백도어를 만드는 코드를 주입하도록 프로그램될 수 있습니다. 로그인 프로그램의 코드를 보더라도 백도어의 흔적을 찾을 수 없을 것입니다. 만약 소스 코드가 악성 컴파일러에 의해 컴파일 되었다면, 결과적으로 프로그램에는 백도어가 있을 것입니다.

물론 컴파일러의 코드를 보게 된다면 로그인 프로그램에 악성 코드를 주입하는 코드가 컴파일러에 있다는 것을 알 수 있습니다. 하지만 컴파일러에 악성 코드를 주입하는 컴파일러를 만들 수 있다면, 이론상으로 해커는 악의가 없는 소스로 된 컴파일러를 악성 컴파일러로 만들 수 있습니다.

결론적으로, 컴파일러의 소스 파일과 로그인 프로그램의 소스 파일이 악성코드나 백도어를 포함하지 않을 지라도, 소스 파일을 컴파일 하는 과정에서 악성 코드가 주입될 수 있습니다.

 

반응형

'CS > cs50' 카테고리의 다른 글

[cs50] 사이버보안  (0) 2022.05.28
[cs50] 라우터, TCP/IP  (0) 2022.05.07
[cs50] 문법, 변수  (0) 2022.04.30
[cs50]네트워크_IP(IPv4, IPv6 ) , DNS, DHCP  (0) 2022.04.16
[cs50] 컴파일, 디버깅  (0) 2022.04.09