웹 서비스와 통신 하는 방법

2020. 7. 22. 17:15웹서비스

인터넷은 ‘노드'와 ‘노드'가 네트워크로 연결된 공간입니다. 이 ‘노드’에 IP 주소가 있으면 ‘host’라고 부릅니다. ‘host’라는건 ‘집주인', ‘운영자'라는 의미를 가지고 있습니다. 쇼핑 호스트가 대표적인 예가 될 것 같네요.

 

‘host’는 서비스 제공을 진행하는 것으로, 쇼핑 호스트는 방송으로 상품을 소개하고 판매를 진행합니다. 마찬가지로 인터넷에서 서비스를 진행하고 제공하는 컴퓨터를 ‘host’라고 합니다. 서비스를 제공하는 컴퓨터는 ‘서버'라고 합니다.

 

모든 ‘서버'는 ‘host’이지만, 모든 ‘host’는 ‘서버'가 아닙니다.

 

예를 들어 친구끼리 파일을 주고 받거나, 내 컴퓨터에 원격접속해서 컴퓨터를 고쳐주는 것은 서비스를 제공하는 별도의 컴퓨터(서버)가 필요없이 바로 내 컴퓨터와 친구 컴퓨터가 연결됩니다. 이 경우에도 내 컴퓨터와 친구 컴퓨터는 ‘host’라고 합니다. 웹 호스팅이라는 단어는 많이 들어보셨을 겁니다. 웹 호스팅은 웹에 서비스를 할 수있도록 서버의 일부 자원을 임대해 운영해 주는 서비스를 말합니다.


호스트 서버가 있으면 웹 서비스를 할 수 있는 관문은 마련되었습니다. 이제 사용자가 웹 브라우저에서 도메인이나 IP주소로 접속하게 되면 웹브라우저는 HTTP-HyperText Transfer Protocol 통신으로 호스트 서버에 요청(Request) 하게 됩니다. Request 받은 서버는 처음에 무엇을 줘야할지 미리 정해진 html이 있다면 해당 html파일로 응답(Response) 합니다.

 

요청을 의미하는 Request와 응답을 의미하는 Response는 상당히 자주 쓰이면 중요한 개념입니다. 모든 사용자와 서버 사이에는 요청 Request하고 응답 Response 합니다.

 

원하는 요청을 해야지 원하는 답을 줍니다.
요청이 없으면 서버는 당연히 답을 주지 않습니다.

 

우리가 흔히 ‘상식적으로 이건 이래야 하는거 아냐?’같은 자동적으로 내 생각에 내가 원하는 답을 주기를 바라지만, 컴퓨터는 ‘인간의 상식'이 없습니다. 처음 개발하시는 분들이 의외로 굉장히 많이 간과하시는 부분입니다. 요청을 하지 않고 응답만 기다리거나, 원하는 요청을 하지 않고 원하는 답이 안나오면, 컴퓨터가 이상하다고 컴퓨터 탓을 합니다. 이런 것에 상당히 많은 분이 시간을 허비합니다.

 

원하는 요청(Request)를 해야 원하는 답(Response)을 얻을 수 있습니다.

어쨋건, 웹 브라우저는 HTTP 통신으로 서버에 Request하고 서버는 html로 Response 합니다. 웹 브라우저는 Response 받은 html을 분석하여 화면에 보여줍니다. html은 HyperText Markup Language 로 문서간 이동이 가능하도록 태그(Tag)로 둘러싼(Markup) 구조화된 언어로 작성된 문서입니다. 여기에서 태그(Tag)는 간단히 말해, 워드문서의 스타일같은 형태라고 보시면 됩니다. 제목 스타일은 굵고 크게하거나, 목록 스타일은 앞이나, 숫자들 달거나, 글에 밑줄이나 색상을 다르게 하거나 하는 것을 말합니다. 웹브라우저는 이런 태그(Tag)를 분석하여 워드 문서처럼 화면에 보여줍니다.


웹 브라우저에 사이트를 접속하기 위해 도메인 주소 www.dodorida.com과 같은 주소만 입력하지만, 웹 브라우저는 도메인 주소 앞에 http:// 라는 것을 추가하여 보냅니다. 이런 것을 스킴(Scheme)이라고 부릅니다. 스킴은 ‘계획', ‘설계'라는 의미를 가지고 있습니다.   


http로 설계된 도메인을 접속하라는 의미로 해석될 수 있습니다. http://www.dodorida.com은 http로 설계된 www.dodorida.com 도메인에 접속하라는 의미이고, ftp://www.dodorida.com 이면 ftp로 설계된 www.dodorida.com으로 접속하라는 의미입니다. 다시말해 하나의 도메인에 여러개의 인터넷 서비스를 할 수 있다는 의미도 됩니다. 하지만, www.dodorida.com 서버가 http 서비스로 설정되어 있으면 ftp 서비스는 찾을 수 없다는 오류를 응답합니다.


어떻게 하면 하나의 도메인 또는 IP 주소에 여러개의 서비스가 가능하게 할까 고민하던 중 Port라는 개념을 도입합니다. Port는 ‘항구'라는 의미를 가지고 있습니다. 항구는 배가 들어왔다 나가는 곳이고, 중세에는 해외에서 바다를 통해 들어오는 유일한 통로 였습니다. 하나의 서버에서도 여러개의 서비스가 가능하도록 여러개의 항구 번호를 만들어 각 서비스에 맞게 열었습니다. 흔히 www.dodorida.com으로 접속하면 기본으로 약속된 80 이라는 port로 접속하게 됩니다. 80은 http 서비스가 가능한 모든 서버의 공통 포트입니다.

 

각 포트마다 목적이 다르기 때문에 특정인만 들어오도록 close할 수 있고, 모든 사람이 다 접속할 수 있도록 open 할 수 있습니다. 기본 80 포트는 오픈된 http 포트입니다.

 

웹 브라우저로 www.dodorida.com만 입력하지만, 웹 브라우저는 http://www.dodorida.com:80으로 서버에 요청을 하게 됩니다.   

 

정리하면 웹 서버에 접속하기 위한 전체 주소는 ‘스킴://도메인:포트’로 정의 됩니다. 이것을 URL Uniform Resource Locator이라고 합니다. ‘통합 자원 위치지정자'라고 해석될 수 있습니다. 좀 더 확장된 개념으로 URI Uniform Resource Identifier ‘통합 자원 식별자'가 있습니다. 간단히 말해서 url은 http://www.dodorida.com/aaa.pdf 라고 하면 www.dodorida.com서버의 aaa.pdf 파일 위치를 말하는 거라면 uri는 http://www.dodorida.com/aaa/b처럼 파일 자원의 위치가 아닌 aaa/b라는 고유 식별자로 접속하면 식별자에 해당하는 서비스를 제공한다는 의미입니다.


포트를 열어서 여러개 서비스가 가능하도록 했습니다. 항구라는 말그대로 포트에는 다수의 접속자가 접속할 수 있습니다. 대부분 Request 하고 Response를 받습니다. 사용자가 Request를 하면 서버에서 Response가 올때까지 대기 합니다. Response가 전달되면 서버는 바로 연결을 끊어버립니다. 다시 Request를 하면 다시 연결하고 Response를 전달합니다. 그리고 바로 연결을 끊어버립니다.

 

서버입장에서는 연결된 상태를 계속 유지하고 있을 이유가 없기 때문입니다.

 

유지하는 것 자체가 자원 낭비이고, 수 많은 요청마다 연결을 계속 유지한다면 과부하가 걸릴 수도 있습니다. 요청할 때만 응답을 주니 실시간으로 데이터를 받고 싶을때 불편합니다. 이것을 해결하고자 나온 개념이 소켓(Socket)입니다.


소켓(Socket)은 흔히 알고 있는 멀티탭에 전원을 꼽는 소켓과 같은 의미입니다. 나와 서버에서 제공하는 소켓에 선을 이어서 연결상태를 계속 유지하는 개념입니다. 소켓에 연결하면 서버에서 데이터의 업데이트나 뭔가 액션이 발생할 경우 따로 요청하지 않아도 데이터를 실시간으로 전달 받을 수 있습니다.

 

소켓은 채팅에서 많이 사용하는 방식입니다. 채팅방에 들어가는 것에서 부터 소켓 연결이 이루어 집니다. 상대방이 메시지를 보내면 소켓에 연결된 나에게 메시지를 전달하게 됩니다. 소켓은 서버 자원 CPU, Memory등이 한계가 있기 때문에 한계를 넘어가면 더이상 소켓을 만들수가 없습니다. 멀티탭도 소켓 개수가 있습니다. 다 연결된 상태에서 더 연결하고 싶으면 하나는 제거하고 연결해야 합니다. 웹 서비스의 소켓도 같다고 보시면 됩니다.

 


지금까지 Host, Request, Response, Scheme, Port, URL, URI, Socket을 알아봤습니다. 여기에서 하나만 더 보도록 하겠습니다. 온라인이면 시도때도 없이 뉴스에 등장하는 보안을 넘어갈 수는 없습니다. 특히나 내 개인정보가 있는 데이터는 반드시 보안이 있어야 합니다.

 

HTTP 통신은 보안이 없는 일반적인 통신 방식입니다. 보안이 없는 통신으로 내 개인정보로 요청할 경우 해커의 대상이 되기 쉽습니다. 그래서 이를 보완하기 위해 개인정보가 들어간 민감한 통신은 암호화 하여 통신할 수 있도록 만들기에 이릅니다. 이렇게 나온 개념이 HTTPS (HyperText Transfer Protocol Over Secure Socket Layer)입니다. ‘안전한 소켓 층의 HTTP’라는 의미로 해석될 수 있을 듯 합니다.

 

SSL (Secure Socket Layer)는 사용자와 서버간의 인증서의 인증키를 가지고 암호화, 복호화 하는 방식을 말합니다. 이렇게 암호화된 네트워크상에 HTTP 통신이 될 수 있도록 만든 통신 방식이 HTTPS 입니다.

 

HTTPS에서 통신되는 데이터는 암호화, 복호화를 거쳐 오가게 되며, 서버와 나와 주고 받는 데이터를 다른 네트워크가 데이터를 위조, 변조를 하지 못하게 됩니다. 참고로 https로 접속하여 응답 받은 데이터안에서 http 일반 통신은 차단됩니다. 이 부분은 실제 개발에 필요한 주의점이기 때문에 개발 과정에서 다시 말하도록 하겠습니다.