아두이노 코딩-69: 이두이노의 불청객 FAVICON 과 request에 따른 아두이노 웹서버의 반응과 대책

codingart(66)
Published in
#kr
Words
557
Reading
3 min
Listen
Play
8y

noname01.png

Favicon 다시 말해서 favorite icon. 파비콘은 그림의 사례에서 볼 수 있듯이 서버 컴퓨터와 인터넷 웹브라우저 간의 request를 주고받는 과정에서 사용되는 16X16 저해상도 비트맵 수준의 아이콘이다. 아두이노와 같은 마이크로콘트롤러 레벨에서 보면 정상적인 서버급 컴퓨터는 기득권에 해당한다. 모든 것이 기득권에 맞춰져 있는 것이고 파비콘 역시 족보가 있는 기득권 서버급 컴퓨터에서는 당연한 것이다.

클라이언트가 서버를 대상으로 request를 보낸다고 하자. 서버하면 하다못해 라즈베리 파이라해도 최소한 탑 디렉토리에 해당하는 루트 디렉토리가 있기 마련이며 자신의 상징으로 비트맵 로고 즉 파비콘을 가지고 있기 마련이다.

하지만 아두이노를 보면 불쌍하게도 디렉토리 구조를 가지지 못하는 생물학적으로 비유한다면 하등한 단세포 아메바와 같은 마이크로 콘트롤러일 따름이다. 그래도 사실 아두이노가 적어도 서버 구실을 할 수 있다는 점은 앞서 포스팅한 예제에서 이미 확인들 하셨을 터이다.

어쨌든 아두이노가 디렉토리 구조를 가지지 못한 죄로 탑 디렉토리에 자신의 비트맵 로고를 가질 수 없다는 점이 족보에 이름조차 못 올린 홍길동과 마찬가지로 슬프긴 하나 중요한 점은 아두이노를 서버로 쓸 경우에 자꾸만 나타나서 귀찮게 구는 이 파비콘 놈들을 어떻게 안전하게 잠재우느냐는 것이다.

아무리 아두이노이지만 request 가 입력 버퍼에 들어오면 그에 맞춰서 적절하게 대응을 해야 하는게 클라이언트/서버계의 불문율이라면 파비콘이 없는 아두이노로서는 파비콘 request 라는 점이 확인 될 경우 무시하고 넘어가면 되는 것이며 이를 코딩에서 구현해야 한다.

파비콘 대책

아두이노 웹서버 또는 아두이노 NodeMCU 웹서버 LED ON OFF 프로그램을 실행시킨 후 스마트폰 웹 브라우저 주소창에서 가상 ip를 입력하고 엔터를 실행하면 웹 브라우저에서 2가지 종류의 request 신호가 아두이노 웹서버 프로그램에 전달되는데, 이는 시리얼 모니터의 출력 결과로 확인할 수 있다.

이 문제를 확인해 보기 위해서 아두이노 NodeMCU/WeMos 웹서버 프로그램 중 loop() 코드에 아래와 같이 client.flush() 바로 앞 위치에 2 줄의 명령을 추가하여 입력 버퍼에 수신되는 request의 길이를 조사해 보기로 하자.

// Read the first line of the request
String request = client.readStringUntil('\r');
Serial.println(request);
Serial.print("String.length(request)=");//추가된 부분
Serial.println(request.length());//추가된 부분
client.flush();

컴파일 업로딩하여 와이파이에 의해 코드를 실행해보면 다음과 같은 결과를 얻어낼 수 있다. 시리얼 모니터에서 처음에 가상 ip 출력과 함께 와이파이가 연결된 상황을 확인할 수 있다.
여기서 출력된 가상 ip를 스마트 폰 주소창에 입력하고 엔터를 누르면 스마트 폰 웹 브라우저가 클라이언트로서 와이파이를 통해서 request를 아두이노 NodeMCU/WeMos에 전달하게 되는 것이다.

noname02.png

그 다음 주목할 사항은 스마트폰 사용자가 더 이상의 아무런 request를 아두이노 NodeMCU/WeMos에 하지 않았음에도 불구하고 웹브라우저가 자동적으로 favion.ico request를 자동적으로 발송했다는 점이다.

즉 GET / HTTP/1.1 과 GET /favicon.ico HTTP/1.1 두 종류의 request 가 수신됨을 알 수 있다. 앞의 request에 대해서는 아두이노 코드가 정상적으로 코드를 실행해 LED를 ON OFF 할 수 있도록 해야 하지만 만약에 그 request가 favicon.ico 일 경우 아두이노의 비트맵 로고를 보내달라는 뜻이므로 이 request에 LED를 ON OFF 해 주어서는 안되는 것이다.

즉 아두이노에 있어서 파비콘 request를 잘못 처리하면 request 피싱을 당하는 셈이 된다.

따라서 추가된 2줄의 명령 실행에 의해 스마트폰 웹브라우저에서 발송되는 request의 길이를 점검하여 특히 문자 길이가 25인 favicon.ico request를 철저히 찾아내어 if 문을 써서 아두이노 제어 프로그램이 반응하지 않도록 건너뛰게끔 코딩 할 필요가 있다.

GET / HTTP/1.1 -> 총 14자
GET / favicon.ico HTTP/1.1 -> 총 25자
GET /LED=ON HTTP/1.1 -> 총 20자
GET /LED=OFF HTTP/1.1 ->총 21자

따라서 다음과 같이 파비콘을 걸러낼 수 있도록 코딩하면 된다.

noname03.png

특히 모든 웹브라우저가 favico.ico request를 송출하기 때문에 아직까지는 와이파이를 사용하는 아두이노 NodeMCU/WeMos 웹서버 나 또는 유선 방식의 아두이노 이더넷 웹서버 수준에서 이 favicon 문제를 해결하는 것은 구조적으로 해답이 없어 보인다.

LED ON OFF 와 같이 간단한 장난감 수준에서는 아무런 문제가 되지 않겠지만 만약에 LED ON OFF 가 아니라 위험한 장치를 ON OFF 하는 경우라면 아두이노 마이크로 콘트롤러에서 이 파비콘 처리 문제는 곧 핵폭탄 처리 문제와 진배가 다를 바 없으므로 반드시 서버 코딩 시에 위의 사례에서와 같은 완벽한 파비콘 처리 코딩이 선행되어야 한다.

아두이노 코딩-69: 이두이노의 불청객 FAVICON 과 request에 따른 아두이노 웹서버의 반응과 대책 | Ecency