HTTP 프로토콜의 요청과 응답은 헤더(header, 부가 정보)와 바디(body, 실제 데이터)로 구성된다.
HTTP의 헤더와 바디는 개행문자인 '\r\n'으로 구분되며, 헤더와 바디 사이에 한 개의 빈 줄(line)이 존재한다
HTTP 공통 헤더 주요항목은 아래 사이트를 참조하자
HTTP 요청 헤더 주요항목은 같은 사이트에서 확인할수 있다.
Method, URL, HTTP 버전
- GET, POST 등 HTTP 메소드
- 요청하는 URL
- HTTP 버전 정보
ex) Get /example/test.html HTTP/1.1
Accept
- 서버로부터 전송 받고자 하는 콘텐츠의 MIME 타입을 지정
- 이를 통해 웹 브라우저에 최적화된 타입의 데이터 사용 가능
- Accept-Charset : 문자 인코딩 타입
- Accept-Language : 지원 언어
Accept-Encoding : gzip 등 압축 형식
ex) Accept : image/gif, image/png
ex) Accept-Language : ko, en-us
If-Modified-Since
- 지정한 날짜 이후로 변경된 경우에만 수신하도록 지정
ex) If-Modified-Since : Mon, 18 Jul 2016 12:15:00 GMT
User-Agent
- 웹 브라우저(웹 클라이언트)의 정보를 지정
ex) User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36
Cookie
- 웹 서버의 요청에 의해 클라이언트에 저장해 놓은 쿠키를 키와 값의 쌍으로 전송- 대표로 Session ID가 있음
Host
- 대상 서버의 도메인 이름으로 포트 정보 포함 가능
ex) Host : www.abcd.com
Origin
- 해당 요청이 어느 주소에서 시작되었는지 명시
Referer
- 이번 요청 이전의 페이지 주소를 지정
ex) Referer : https://www.google.com/
HTTP 응답 헤더 주요항목은 같은 사이트에서 확인할수 있다.
HTTP 버전, 응답 코드
- HTTP 버전 정보- HTTP 프로토콜에 정의된 응답코드
ex) HTTP/1.1 200 OK
Server
- 웹 서버의 정보를 명시
ex) Server : Apache/2.2.24
Location
- 응답코드 301, 302 리다이렉션 상태에서 위치 정보를 지정
Set-Cookie
- 클라이언트에 저장할 쿠키 정보를 지정
- Expires : 만료일
- Secure : HTTPS에서만 사용
- HttpOnly : 스크립트에서 접근 불가
- Domain : 같은 도메인에서만 사용
위에 것들을 함께 설정 가능
Expires
- 해당 리소스의 유효 일시를 지정
Allow
- 응답 코드 405 (Method Not Allowed) 상태에서 서버가 제공할 수 있는 HTTP 메서드를 지정
이상을 참조한 후 공인 IP를 구하는 방법은 https://www.ipify.org/ 사이트에서 방법을 찾을수 있다.
다양한 코드가 예시로 제공된다.
그러나 아두이노 코드는 2% 부족하다
그리고 헤더와 같이 출력된다.
if (client.connect("api.ipify.org", 80)) {
Serial.println("connected");
client.println("GET / HTTP/1.0");
client.println("Host: api.ipify.org");
client.println();
} else {
Serial.println("connection failed");
}
이것도 초심자에게는 어렵다 일단 결론을 보자면 아래와 같다
HTTP/1.1 200 OK
Server: nginx/1.25.1
Date: Sun, 27 Aug 2023 16:19:57 GMT
Content-Type: text/plain
Content-Length: 15
Connection: close
Vary: Origin
203.234.197.199 <<< 공인IP(예시)
HTTP로 시작하는 부분은 앞서 설명한것과 같이 응답 헤더, 한칸 띄우고 적혀있는것이 구하고자하는 공인 IP다.
필요한것은 공인 IP다.
그리고 주기적으로 이를 확인하기 위한 방법은 별도로 설명하겠다.
결론은 아래 코드와 같다(함수로 구현하였다.)
String GetExternalIP() {
if (client.connect("api.ipify.org", 80)) {
client.println("GET / HTTP/1.0");
client.println("Host: api.ipify.org");
client.println();
String ipAddress = "";
while (client.connected()) {
if (client.available()) {
String line = client.readStringUntil('\n');
// 빈 줄을 만나면 바디 정보 시작
if (line == "\r") {
while (client.available()) {
String bodyLine = client.readStringUntil('\n');
ipAddress = bodyLine;
break;
}
break;
}
}
}
client.stop();
return ipAddress;
} else {
return "";
}
}