ESP32C3 Super Mini를 이용해서 IoT 센서를 만들어서 진동을 감지할 때마다 앱의 백엔드 서버에게 신호를 보내주려고 했다. ESP32는 와이파이 모듈을 탑재하고 있기 때문에 와이파이만 존재한다면 신호를 감지해서 백엔드에 신호를 보낼 수 있다. 스마트폰 핫스팟을 틀어서 간단한 http 통신에 성공했고, 기숙사에 있는 무료 와이파이를 이용해서 신호를 보내려했으나 문제가 생겼다.
캡티브 포털
개인이 열어놓은 와이파이가 아닌, 정부나 기업에서 열어놓은 무료 와이파이는 캡티브 포털이란 로그인 페이지를 거쳐야 이용할 수 있다. 스마트폰이나 노트북의 경우 인터넷 접속을 시도하면 자동으로 어떤 페이지로 이동하고, 거기서 "이용하기"버튼을 누르면 인터넷을 이용할 수 있다.
하지만 ESP32는 IoT 센서 역할만 할 수 있도록 만들어진 병뚜껑 사이즈의 초소형 컴퓨터이기 때문에 웹브라우저를 이용할 수 없어서 버튼을 누르는건 불가능하다. 따라서 이 캡티브 포털에 접속해서 "이용하기" 버튼을 누른 것처럼 HTTP 요청을 보내는 것이 캡티브 포털을 넘어가는 것의 핵심이다.
1단계: 캡티브 포털 서버 주소 찾기
ESP32가 웹브라우저처럼 자동으로 캡티브 포털을 감지할 수는 없지만, 캡티브 포털의 작동 원리를 이용하면 주소를 찾을 수 있다.
캡티브 포털의 작동 원리:
- WiFi 연결 직후에는 모든 인터넷 요청이 차단됨
- 어떤 웹사이트를 접속하려 해도 캡티브 포털 서버로 강제 리다이렉트(HTTP 302)됨
- 이 리다이렉트 응답의 Location 헤더에 캡티브 포털 주소가 들어있음
코드 구현:
#include <WiFi.h>
#include <HTTPClient.h>
const char* ssid = "무료와이파이";
void setup() {
Serial.begin(115200);
// WiFi 연결
WiFi.mode(WIFI_STA);
WiFi.begin(ssid);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nWiFi 연결 성공");
// 아무 HTTP 사이트나 접속 시도
HTTPClient http;
http.begin("http://neverssl.com");
http.setFollowRedirects(HTTPC_DISABLE_FOLLOW_REDIRECTS); // 리다이렉트 자동 추적 OFF
int httpCode = http.GET();
if (httpCode == 302) {
// 리다이렉트 발생! Location 헤더에서 캡티브 포털 주소 확인
String location = http.header("Location");
Serial.println("캡티브 포털 발견: " + location);
// 결과: http://wifi.무료와이파이.com
}
http.end();
}
이 방법으로 우리 기숙사의 캡티브 포털 주소가 http://wifi.무료와이파이.com임을 알아냈다.
2단계: HTTPS 접속 문제 해결
캡티브 포털 주소를 찾았지만, 바로 접속하면 또 다른 문제가 발생했다.
http.begin("http://wifi.무료와이파이.com");
http.GET();
// 결과: HTTP 301 (HTTPS로 리다이렉트)
최근 많은 웹사이트들이 보안을 위해 HTTP 대신 HTTPS만 허용한다. HTTPS는 암호화 통신을 위해 SSL/TLS 인증서가 필요한데, ESP32는 기본적으로 이 인증서를 검증할 수 없어서 연결이 실패한다.
해결책: WiFiClientSecure + setInsecure()
#include <WiFiClientSecure.h>
WiFiClientSecure client;
client.setInsecure(); // 인증서 검증 건너뛰기
HTTPClient http;
http.begin(client, "https://wifi.무료와이파이.com");
int httpCode = http.GET();
String html = http.getString();
Serial.println("캡티브 포털 페이지 가져오기 성공!");
setInsecure()는 인증서 검증을 건너뛰고 HTTPS 연결을 허용한다. 보안이 중요한 금융 거래 등에는 사용하면 안 되지만, 캡티브 포털 접속처럼 단순히 로그인 페이지를 가져오는 용도로는 문제없다.
3단계: "이용하기" 버튼 분석
HTTPS 접속에 성공하여 캡티브 포털의 HTML 페이지를 받아왔다. 약 7,725 bytes 크기의 HTML 코드 속에서 핵심 정보를 찾아냈다.
<a class="btn" href="http://www.무료와이파이.com/benefit-event/ongoing/81332">
WIFI 연결하기
</a>
웹브라우저에서 이 버튼을 클릭하면 해당 URL로 이동하면서 서버에 "이 사용자가 이용 동의를 했어요"라고 알려주는 것이다. 서버는 사용자의 MAC 주소를 허용 목록에 추가하고, 이후부터 인터넷 사용이 가능해진다.
ESP32도 이 URL에 단순히 GET 요청만 보내면 된다!
