LESSON3. HTTP를 이해하자
소프트웨어를 만드는 개발자로서 하드웨어적인 부분까지 모두 알 수는 없지만 기본적인 지식은 알아야 문제가 발생시 어디서 문제가 발생을 하였고 그것을 어떻게 해결할지 알겠죠. 그런 기본적인 지식 중 하나가 HTTP입니다. Fiddler라는 프로그램을 통해 HTTP가 어떻게 통신하는지 알 수 있다고 하는데요. 우선 Mac에서 어떻게 설치하는지 알아봅시다.
- 구글 검색창에 'Fiddler'를 치면 해당 웹 사이트가 나옵니다. 그 사이트 내에서 'Free download'를 찾을 수 있는데요. 여기서 간단하게 다운로드 이유 및 라이센스 동의 체크만 하면 프로그램을 다운 받을 수 있습니다.
- 이렇게 하면 끝날 줄 알았는데 다운받으니 zip파일이더라구요. 그 안엔 맥에선 작동하지 않는
.exe
실행파일이 있습니다. Mac의 경우 프로그램을 가동하기 위해 몇 가지 절차를 더 거쳐야 합니다. - Mono라는 프로그램을 설치합니다. Mono는 플랫폼 상관없이 작동하게끔 해주는 프로그램인 것 같아요.
- Mono를 설치하면 뭐 애플리케이션 아이콘이 생기거나 그렇지 않습니다. 근데 이게 설치 끝이 아닙니다. 터미널에 들어가서
/Library/Frameworks/Mono.framework/Versions/<Mono Version>/bin/mozroots --import --sync
까지 해줘야 끝나고 여기 명령문에서 Mono Version은 다운 받을 때 본인이 받은 버전을 넣으면 됩니다. 저의 경우 5.10.1를 다운 받았네요. - 이제 마지막으로 1에서 받은 zip파일을 풀고 Terminal에서 해당 경로로 이동 후(그러니까 Fiddler.zip이 풀린 경로)
mono Fiddler.exe
을 터미널 상에서 입력하면 됩니다. 근데 이게 안됩니다. 이 사례처럼 Apple Crash가 뜹니다. - 이건 Mono라는 프로그램이 64bit 시스템으로 작동시키는데 이 상태에서 Fiddler가 작동이 안되기 때문입니다. 그렇기 때문에 Mono를 32bit로 작동시켜야 합니다. 그래서
mono --arch=32 Fiddler.exe
를 터미널에 입력시키면 됩니다. - 이게 처음엔 설치과정이 안 보이는 상태에서 한 1~2분 정도 필요하더라구요. 안되는 줄 알고 구글링 하다보니 그제서야 설치완료되고 애플 보안 확인 창이 떴습니다. 그리고 보안 확인 창을 넘기면 그제서야 이제 프로그램이 뜨는 것이죠.
신기한게 웹브라우저 뿐만 아니라 인터넷과 관련된 모든 것(카카오톡, 드롭박스 등) 그리고 애플이 인터넷과 통신하고 있는 부분까지 다 볼 수 있더라구요! 평소 눈에 안보이던 것들을 다 보니까 신기했어요. 근데 이게 통신을 중간에 가로채서 보여주는 것이라 체감상 평소보다 속도가 좀 느린 것 같아요.
이 프로그램에 대해 이것저것 살펴보다가 넘겨주는 HTML을 보려고 www.naver.com에 접근하였습니다. 그런데 갑자기 시스템이 강제 종료되는 것입니다.. 그리곤 평소 보지 못한 오류 메시지와 함께 재부팅을 하게 되었습니다. 재부팅 하고 문제점은 인터넷이 안된다는 것입니다. 처음엔 인터넷 모뎀의 문제인 줄 알았는데 다른 전자기기에선 와이파이가 잘 되는 것을 확인하고 제 맥북 프로의 문제임을 알게되었습니다.
- 첫번째로 한 방법은 System Preference > Network에 들어간 다음 기존 wifi 연결된 것들을 모두 지웁니다.
전 이 방법을 해보면서 이미 다 지운 상태인데요. 원래 저기에 엄청나게 많은 wifi들이 있을겁니다. 다 지우고 재부팅하고 기존 와이파이에 연결하면 됩니다. 그런데!! 저는 이 방법이 효과가 없더라구요.
- 두번째 방법은 와이파이를 지우고 다시 만드는 것입니다.
여기서 - 를 통해 지우고 바로 옆에 +을 누르면 다시 와이파이를 만들 수 있습니다.
이렇게 하고 다시 와이파이를 잡아주면 저의 경우 해결되었습니다!! 하.. 너무 놀랐어요. 와이파이 기능이 고장난 줄 알고요. 애플은 고치면 수리비가 너무 많이 들고, 또 전 2년이 지나서 애플케어 못 받고, 제 물건 중에 가장 비싼 물건이고.. 한 동안 치킨 못 먹을 뻔 했네요..
이제 다시 본론으로 돌아와서 HTTP 응답 중 자주 보이는 상태 코드 몇 개만 정리해볼게요.
- 200 [OK] : 요청이 정상적으로 완료됐음을 나타낸다
- 302 [Found] : 요청된 리소스가 일시적으로 다른 URI에 속해 있음을 나타낸다.
- 404 [Not Found] : 요청 URI와 일치하는 리소스를 찾지 못했음을 나타낸다.
- 500 [Internal Server Error] : CGI 프로그램 등 서버 내부의 프로그램 실행 과정에서 에러가 발생했음을 나타낸다
IP주소는 원래 0부터 255까지의 수가 4개로 조합된 수로 이루어져 있는데요(예를 들어 192.168.0.1). 우리가 집 주소를 위도, 경도가 아닌 알기 쉽게 문자 주소를 가지고 있듯이 인터넷 주소도 편의상 문자의 주소로 되어있습니다. 그리고 정보를 보낼 때 그 사이의 배달 역할을 하는 것이 TCP/IP라고 하는 프로토콜입니다. TCP/IP는 패킷(Packet)이라고 하는 작은 정보 단위로 분할하여 송신하고, 받는 쪽에선 그것을 조립하여 수신자에게 보내줍니다. 이렇게 나누는 이유는 네트워크 전송 중 실패하는 패킷이 발생하면 해당 패킷만 다시 보내주면 더 효율적이기 때문이죠.
앞서 숫자로 된 IP주소를 문자로 사용한다고 하였는데요. 이를 변환시켜주는 것이 DNS(Domain Name Service)입니다. 하나의 서버에서 이 모든 주소를 관리하기엔 너무나 정보량이 크기 때문에 분산하여 관리하고 있는데요. 예를들어 daum.net 이라고 있다면 그 daum과 net이라는 계층으로 나뉘고 net이 더 상위 계층이기 때문에 daum이 있는지 묻는 것이죠. 그리고 있으면 숫자로 된 주소를 반환합니다.
IP 주소를 안다고 통신을 제대로 할 수 있는 것만은 아닙니다. 왜냐하면 수많은 어플리케이션이 있는데 만약 여러 개의 애플리케이션에서 동시에 하나의 주소에 정보를 보내준다면 TCP/IP는 이를 다 구별할 수 있을까요? 그렇기 때문에 포트(Port)이 필요합니다. Port는 말그대로 '항구'로서 수신하는 어플리케이션은 특정 포트에서 응답을 받는 것입니다. 그럼 왜 이때까지 우린 포트를 따로 설정하지 않았을까요? 그 이유는 우리가 자주 사용하는 어플리케이션의 경우 자동으로 해당 포트 번호를 정해놓고 알아서 그에 맞게 사용되기 때문이죠. 포트번호 80은 HTTP(웹 브라우징) 프로토콜인데요. 알게모르게 80번 포트에서 서로 통신을 하고 있었던 것입니다.
마지막으로 통신을 할 때 빠지지 않는 내용이 GET요청과 POST요청이죠. 상식처럼 알고계시겠지만 Fiddler를 통해 다시 살펴보시죠. POST 요청은 URL 뒤에 '매개변수=값'의 조합을 &(앰퍼샌드)로 구분하여 전달합니다. 예를들어 2개의 정수를 매개변수로 전달하면 다음과 같습니다.
네모 친 부분을 보면 GET 요청으로 두 개의 인자(arg1, arg2)가 & 구분으로 전달된 것을 볼 수 있습니다. 그럼 POST 요청은 어떻게 값을 전달할까요?
POST요청의 경우에도 두 개의 인자(arg1, arg2)가 & 구분으로 전달되긴 하지만 그 값들이 URL 안이 아니라 요청 메시지 안에 들어가 있음을 볼 수 있습니다.
그럼 GET방식보다 POST방식이 더 좋은 것인가?
꼭 그렇지만은 않습니다. 용도에 따라 다른것이죠. 예를들어 구글의 경우 검색을 하면 GET 방식을 사용하고 있습니다. 그 이유는 검색 결과를 나중에 보고 싶고 또 친구와 공유한다고 하면 그 매개변수가 드러나는 URL을 보관하면 되는데. 만약 POST방식으로 한다면 www.google.com 만 노출될 것이기 때문입니다. 그런데 POST방식으로만 사용해야 하는 것은 비밀번호, 엄청나게 긴 매개변수(사진 데이터 등), 결제 요청 등과 같이 보안상 노출이 되면 안된다던가 부작용이 예상되는 경우에 해당합니다.
HTTP를 배우는 과정에서 여러 실습을 진행하였고 그 사이에 작은 오류들이 몇 개 발생하였네요. 앞으로 이런 오류들이 심심치않게 등장하겠지만 이런 것들에 대처하는 노하우가 쌓여 컴퓨터 지식이 늘것이라 생각합니다!
'Book > programming' 카테고리의 다른 글
프로가 되기 위한 웹기술 입문3 (2) | 2018.11.09 |
---|---|
프로가 되기 위한 웹기술 입문2 (0) | 2018.11.08 |
스프링 입문을 위한 자바 객체지향의 원리와 이해6 (2) | 2018.10.27 |
스프링 입문을 위한 자바 객체지향의 원리와 이해5 (0) | 2018.10.21 |
스프링 입문을 위한 자바 객체지향의 원리와 이해4 (0) | 2018.10.18 |