{"id":5429,"date":"2026-04-20T11:32:47","date_gmt":"2026-04-20T02:32:47","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=5429"},"modified":"2026-04-20T11:52:33","modified_gmt":"2026-04-20T02:52:33","slug":"webserver-miniwebserver-1","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/04\/20\/webserver-miniwebserver-1\/","title":{"rendered":"[Webserver]miniWebserver &#8211; (1)"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb \uc6f9\uc11c\ubc84\uc758 \uad6c\uc870\ub97c \uc774\ud574\ud558\uae30 \uc704\ud574\uc11c \uc544\uc8fc \uac04\ub2e8\ud55c \uc6f9\uc11c\ubc84\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\ub824\uace0 \ud569\ub2c8\ub2e4.<br>To understand the structure of a web server, I am going to try building a very simple web server.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uac19\uc774 \uc7ac\ubbf8\uc788\uac8c \ub9cc\ub4e4\uc5b4 \ubd05\uc2dc\ub2e4.<br>Let&#8217;s have fun making this together.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uc544\ub798\ub294 \ube0c\ub77c\uc6b0\uc800\uc5d0 \uac04\ub2e8\ud55c \uba54\uc2dc\uc9c0\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4.<br>The following outputs a simple message to the browser.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uc124\uba85\uc740 \ucf54\ub4dc\uc8fc\uc11d\uc744 \ucc38\uace0\ud558\uc138\uc694<br>Please refer to the code comments for the explanation.<\/p>\n\n\n\n<p>\u2714\ufe0f \uc804\uccb4\ucf54\ub4dc \/ full code<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#include &lt;iostream&gt;\n#include &lt;cstring&gt;\n#include &lt;unistd.h&gt;\n#include &lt;sys\/socket.h&gt;\n#include &lt;netinet\/in.h&gt;\n#include &lt;thread&gt;\n#include &lt;vector&gt;\n\n#define PORT 5080\n#define BACKLOG 10 \/\/ \ub300\uae30 \ud050 \ud06c\uae30 \/ wait queue size\n\n\/\/ \ud074\ub77c\uc774\uc5b8\ud2b8\uc640\uc758 \ud1b5\uc2e0\uc744 \ub2f4\ub2f9\ud558\ub294 \ud568\uc218 (\uac01 \uc0ac\uc6a9\uc790\ub97c \uc704\ud55c \ubcc4\ub3c4\uc758 \uc4f0\ub808\ub4dc)\n\/\/ Function responsible for communication with clients (separate thread for each user)\nvoid handle_client(int client_socket) {\n    char buffer&#91;1024];\n    std::cout &lt;&lt; \"&#91;Connection] New client connected.\" &lt;&lt; std::endl;\n\n    \/\/ 1. \ub370\uc774\ud130 \uc218\uc2e0 \/ receive data (Read)\n    ssize_t bytes_read = read(client_socket, buffer, sizeof(buffer) - 1);\n    if (bytes_read &gt; 0) {\n        buffer&#91;bytes_read] = '\\0'; \/\/ C-string\n        std::string request = buffer;\n        std::cout &lt;&lt; \"&#91;Received] \" &lt;&lt; request.substr(0, 30) &lt;&lt; \"...\" &lt;&lt; std::endl;\n\n        \/\/ 2. \uc751\ub2f5 \uc804\uc1a1 \/ send response(Write)\n        const char* response = \"HTTP\/1.1 200 OK\\r\\nContent-Type: text\/html; charset=utf-8\\r\\n\\r\\n&lt;h1&gt;\ud83d\udc4bHi~ Hi~ Hi~~~!&lt;\/h1&gt;&lt;p&gt;Welcome to the miniWebserver!&lt;\/p&gt;\";\n        write(client_socket, response, strlen(response));\n    }\n\n    \/\/ 3. \uc5f0\uacb0 \uc885\ub8cc \/ close connection\n    close(client_socket);\n    std::cout &lt;&lt; \"&#91;Connection] Client disconnected.\" &lt;&lt; std::endl;\n}\n\nint main() {\n    \/\/ --- 1. \uc18c\ucf13 \uc0dd\uc131 (Socket Creation) --- \/\/\n    \/\/ AF_INET(Address Family Internet):\n    \/\/ IPv4 \uc0ac\uc6a9, SOCK_STREAM: TCP \uc5f0\uacb0 \ubc29\uc2dd \uc0ac\uc6a9, 0: \ud504\ub85c\ud1a0\ucf5c \uae30\ubcf8 \uc0ac\uc6a9(\uae30\ubcf8\uac12 \uc0ac\uc6a9)\n    \/\/ Use IPv4, SOCK_STREAM: Use TCP connection method, 0: Use default protocol (use default)\n    \/\/\n    \/\/ AF_INET6: IPv6 \uc0ac\uc6a9, SOCK_DGRAM : UDP \uc5f0\uacb0 \ubc29\uc2dd \uc0ac\uc6a9 \/ Use UDP connection method\n    int server_fd = socket(AF_INET, SOCK_STREAM, 0);\n    if (server_fd == 0) {\n        \/\/ perror() : \uc5b4\ub5a4 \uc2dc\uc2a4\ud15c \ud568\uc218\uac00 \uc2e4\ud328\ud560 \uacbd\uc6b0 \ub0b4\uac00 \uc815\uc758\ud55c \uc624\ub958 \uba54\uc138\uc9c0\uc640 \uc6b4\uc601\uccb4\uc81c\uac00 \uc815\uc758\ud55c \uc624\ub958 \uba54\uc138\uc9c0\ub97c \ud568\uaed8 \ucd9c\ub825\ud574\uc90c.\n        perror(\"socket failed\");\n        \/*\n         exit(1)\uc758 \ub3d9\uc791 \uacb0\uacfc\ub294 exit(EXIT_FAILURE)\uac00 \uc758\ub3c4\ud558\ub294 \ub3d9\uc791 \uacb0\uacfc\uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4. \uc989, \ud504\ub85c\uadf8\ub7a8\uc774 '\uc2e4\ud328' \uc0c1\ud0dc\ub85c \uc885\ub8cc\ub41c\ub2e4\ub294 \uc758\ubbf8\uac00 \uac19\uc2b5\ub2c8\ub2e4.\n         exit(0)\uc758 \ub3d9\uc791 \uacb0\uacfc\ub294 exit(EXIT_SUCCESS)\uac00 \uc758\ub3c4\ud558\ub294 \ub3d9\uc791 \uacb0\uacfc\uc640 \ub3d9\uc77c\ud569\ub2c8\ub2e4. \uc989, \ud504\ub85c\uadf8\ub7a8\uc774 '\uc131\uacf5' \uc0c1\ud0dc\ub85c \uc885\ub8cc\ub41c\ub2e4\ub294 \uc758\ubbf8\uac00 \uac19\uc2b5\ub2c8\ub2e4.\n         The result of exit(1) is the same as the intended result of exit(EXIT_FAILURE). In other words, it means the same thing: the program terminates in a 'failed' state.\n         The result of exit(0) is the same as the intended result of exit(EXIT_SUCCESS). In other words, it means the same thing: the program terminates in a 'successful' state.\n         *\/\n        exit(EXIT_FAILURE);\n    }\n\n    \/\/ \ud3ec\ud2b8 \uc7ac\uc0ac\uc6a9 \uc635\uc158 \uc124\uc815 (\uac19\uc740 \ud3ec\ud2b8\ub97c \uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud558\uac8c \ud568)\n    \/* setsockopt() : \uc18c\ucf13\uc5d0\uc124\uc815\uc801\uc6a9\ud558\uae30 \/ Applying settings to the socket\n     * setsockopt(int sockfd,           \/\/ 1. \uc18c\ucf13 \uc2dd\ubcc4\uc790 \/ socket identifier\n                int level,              \/\/.2. \ud504\ub85c\ud1a0\ucf5c \ub808\ubca8 (\uc5b4\ub290 \uacc4\uce35\uc758 \uc124\uc815\uc778\uc9c0) \/ Protocol level (which layer's setting)\n                int optionname,         \/\/ 3. \uc124\uc815\ud560 \uc635\uc158\uc758 \uc774\ub984 (\uc5b4\ub5a4 \uc124\uc815\uc744 \ud560\uc9c0) \/ Name of the option to set (which setting to make)\n                const void *optionval,  \/\/ 4. \uc635\uc158\uc758 \uc2e4\uc81c \uac12 (\uac12\uc744 1\ub85c \uc124\uc815\ud560\uc9c0) \/ The actual value of the option (whether to set the value to 1)\n                socklen_t optionlen);   \/\/ 5. \uc635\uc158 \uac12\uc758 \uae38\uc774 \/ Length of the option value\n\n       SOL_SOCKET :\n        \uc18c\ucf13 \ud1b5\ub85c \uc790\uccb4\uc758 \uc804\ubc18\uc801\uc778 \uc635\uc158 \ubc0f \uc18d\uc131(\uc18c\ucf13\ud1b5\uc2e0\uc744 \uc704\ud55c \uae30\ubcf8 \uac12)\n        Overall options and properties of the socket channel itself (default values \u200b\u200bfor socket communication)\n\n       SO_REUSEADDR :\n        \uc9c0\uae08 \uc774 \ud3ec\ud2b8\ub294 \uc784\uc2dc\uc801\uc73c\ub85c \uc810\uc720\ub41c \uc0c1\ud0dc\uc77c\uc9c0\ub77c\ub3c4, \uc774 \uc8fc\uc18c\ub97c \ub2e4\uc2dc \uc0ac\uc6a9\ud558\ub3c4\ub85d \uc694\uccad\ud558\ub294 \uac83\n        Requesting to use this address again, even if this port is currently temporarily occupied\n\n       opt = 1 : \ud3ec\ud2b8 \uc7ac\uc0ac\uc6a9 \ud5c8\uc6a9 \/ Allow port reuse\n\n    *\/\n    int opt = 1;\n    if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &amp;opt, sizeof(opt)) &lt; 0) {\n        perror(\"setsockopt\");\n        exit(EXIT_FAILURE);\n    }\n\n    \/\/ --- 2. \ubc14\uc778\ub529 (Binding) --- \/\/\n    \/\/ struct sockaddr_in :\n    \/\/   IPv4 \uc8fc\uc18c\ub9cc \ub2e4\ub8e8\uae30 \uc704\ud55c \uad6c\uccb4\uc801\uc778 \uad6c\uc870\uccb4\uc785\ub2c8\ub2e4.\n    \/\/   This is a specific structure for handling only IPv4 addresses.\n    \/\/\n    \/\/ struct sockaddr_in6 :\n    \/\/   IPv6 \uc8fc\uc18c\ub9cc \ub2e4\ub8e8\uae30 \uc704\ud55c \uad6c\uccb4\uc801\uc778 \uad6c\uc870\uccb4\uc785\ub2c8\ub2e4.\n    \/\/   This is a specific structure designed to handle only IPv6 addresses.\n    \/\/\n    \/\/ struct sockaddr :\n    \/\/   \uc774 \uad6c\uc870\uccb4\ub294 \ud2b9\uc815 IP \ubc84\uc804(IPv4\uc778\uc9c0 IPv6\uc778\uc9c0)\uc5d0 \uad00\uacc4\uc5c6\uc774 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uc124\uacc4\ub418\uc5c8\uc2b5\ub2c8\ub2e4.\n    \/\/   This structure is designed to be usable regardless of the specific IP version (whether IPv4 or IPv6).\n\n    struct sockaddr_in address;\n    address.sin_family = AF_INET;         \/\/ IPv4\n    address.sin_addr.s_addr = INADDR_ANY; \/\/ \ubaa8\ub4e0 \uc778\ud130\ud398\uc774\uc2a4 IP \uc0ac\uc6a9 \/ Use all interface IPs\n    address.sin_port = htons(PORT);       \/\/ \ud3ec\ud2b8\ub97c \ub124\ud2b8\uc6cc\ud06c \ubc14\uc774\ud2b8 \uc21c\uc11c\ub85c \ubcc0\ud658 \/ Convert ports to network byte order\n\n    \/\/ \ubc14\ub85c \uc704\uc5d0\uc11c \uc120\uc5b8\ud55c \uad6c\uc870\uccb4 address\uc5d0 \uc18c\ucf13\uc744 \ubc14\uc778\ub529\ud568.\n    \/\/ Bind the socket to the structure address declared just above.\n    \/\/\n    \/\/ (struct sockaddr *)&amp;address : &amp;address\ubcc0\uc218\uc758 \uac12\uc744 (struct sockaddr *) \ud0c0\uc785\uc73c\ub85c \ud0c0\uc785 \uce90\uc2a4\ud305\ud568.\n    \/\/ (struct sockaddr *)&amp;address : Type casts the value of the &amp;address variable to the type (struct sockaddr *).\n\n    if (bind(server_fd, (struct sockaddr *)&amp;address, sizeof(address)) &lt; 0) {\n        perror(\"bind failed\");\n        close(server_fd);\n        exit(EXIT_FAILURE);\n    }\n\n    \/\/ --- 3. \ub9ac\uc2a4\ub2dd (Listening) --- \/\/\n    \/\/ \ucd5c\ub300 \ub300\uae30\ud560 \uc5f0\uacb0 \uc694\uccad \uc218\ub97c \uc9c0\uc815 (BACKLOG)\n    \/\/ Specify the maximum number of connection requests to wait for (BACKLOG)\n    if (listen(server_fd, BACKLOG) &lt; 0) {\n        perror(\"listen failed\");\n        close(server_fd);\n        exit(EXIT_FAILURE);\n    }\n\n    std::cout &lt;&lt; \"Server listening on port \" &lt;&lt; PORT &lt;&lt; \"...\" &lt;&lt; std::endl;\n\n    \/\/ --- 4. \ubb34\ud55c \ub8e8\ud504: \uc5f0\uacb0 \uc218\ub77d \ubc0f \ucc98\ub9ac \/ Accept and handle incoming connections indefinitely --- \/\/\n    while (true) {\n        \/\/ IPv4\uad6c\uc870\uccb4\n        struct sockaddr_in client_address;\n        \/\/ \uc8fc\uc18c \uad6c\uc870\uccb4\uac00 \uba54\ubaa8\ub9ac\uc5d0\uc11c \ucc28\uc9c0\ud558\ub294 \ubc14\uc774\ud2b8 \ud06c\uae30\ub97c \uc800\uc7a5\ud558\ub294 \ubcc0\uc218\uc758 \ud0c0\uc785\n        socklen_t addrlen = sizeof(client_address);\n\n        \/\/ accept() \ud568\uc218\uac00 \ube14\ub85c\ud0b9(Blocking) \uc0c1\ud0dc\uc5d0\uc11c \ud074\ub77c\uc774\uc5b8\ud2b8 \uc5f0\uacb0\uc744 \uae30\ub2e4\ub9bc\n        int client_socket = accept(server_fd, (struct sockaddr *)&amp;client_address, &amp;addrlen);\n        if (client_socket &lt; 0) {\n            perror(\"accept failed\");\n            continue; \/\/ \uc2e4\ud328\ud588\uc73c\uba74 \ub2e4\uc74c \ub8e8\ud504\ub97c \ub3cc\uba70 \uc7ac\uc2dc\ub3c4 \/ Retry in the next loop if it fails\n        }\n\n        \/\/ 5. \ub3d9\uc2dc\uc131 \ucc98\ub9ac: \uc0c8\ub85c\uc6b4 \uc5f0\uacb0\uc774 \uc624\uba74 \uc0c8\ub85c\uc6b4 \uc4f0\ub808\ub4dc\ub97c \uc0dd\uc131\ud558\uc5ec \ucc98\ub9ac\n        \/\/ Concurrency Handling: When a new connection arrives, create a new thread to handle it.\n        std::thread client_thread(handle_client, client_socket);\n        \/\/ \uc4f0\ub808\ub4dc\ub97c \ubd84\ub9ac\ud558\uace0 \uba54\uc778 \ub8e8\ud504\ub97c \uacc4\uc18d \uc2e4\ud589\ud558\uac8c \ud568\n        \/\/ Detach the thread so that the main loop continues running.\n        client_thread.detach();\n    }\n\n    \/\/ \uc774 \ubd80\ubd84\uc740 \ubb34\ud55c \ub8e8\ud504\uac00 \ub3c4\ub2ec\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \/ This part is not reached by an infinite loop.\n    close(server_fd);\n    return 0;\n}\n<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \ucef4\ud30c\uc77c \/ Compiling<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>g++ miniserver.cpp -o miniserver<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f \uc2e4\ud589 \/ Run<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>.\/miniserver<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f\ube0c\ub77c\uc6b0\uc800\uc811\uc18d \/ Access Browser<\/p>\n\n\n\n<p>&#8212; \ube0c\ub77c\uc6b0\uc800\uc5d0 \uc544\ub798\uc758 \uc8fc\uc18c\ub85c \uc811\uc18d\ud569\ub2c8\ub2e4. \/ Access the following address in your browser.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>http:&#47;&#47;localhost:5080<\/code><\/pre>\n\n\n\n<p>&#8212; \ud130\ubbf8\ub110\uacfc \ube0c\ub77c\uc6b0\uc800\uc5d0 \uba54\uc138\uc9c0\uac00 \ucd9c\ub825\ub429\ub2c8\ub2e4. \/ Messages are displayed in the terminal and browser.<\/p>\n\n\n\n<figure class=\"wp-block-gallery has-nested-images columns-default is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\">\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"886\" height=\"474\" data-id=\"5430\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/browser-jpg.jpg\" alt=\"\" class=\"wp-image-5430\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/browser-jpg.jpg 886w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/browser-jpg-300x160.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/browser-jpg-768x411.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/browser-jpg-400x214.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/browser-jpg-800x428.jpg 800w\" sizes=\"auto, (max-width: 886px) 100vw, 886px\" \/><figcaption class=\"wp-element-caption\">\ube0c\ub77c\uc6b0\uc800\/Browser<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"302\" data-id=\"5431\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/server-jpg-2-1024x302.jpg\" alt=\"\" class=\"wp-image-5431\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/server-jpg-2-1024x302.jpg 1024w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/server-jpg-2-300x88.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/server-jpg-2-768x226.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/server-jpg-2-400x118.jpg 400w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/server-jpg-2-800x236.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/04\/server-jpg-2.jpg 1100w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">\ud130\ubbf8\ub110\/Terminal<\/figcaption><\/figure>\n<\/figure>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb \uc6f9\uc11c\ubc84\uc758 \uad6c\uc870\ub97c \uc774\ud574\ud558\uae30 \uc704\ud574\uc11c \uc544\uc8fc \uac04\ub2e8\ud55c \uc6f9\uc11c\ubc84\ub97c \ub9cc\ub4e4\uc5b4\ubcf4\ub824\uace0 \ud569\ub2c8\ub2e4.To understand the structure of a web server, I am going to try building a very simple web server. \ud83d\udc49\ud83c\udffb \uac19\uc774 \uc7ac\ubbf8\uc788\uac8c \ub9cc\ub4e4\uc5b4 \ubd05\uc2dc\ub2e4.Let&#8217;s have fun making this together. \ud83d\udc49\ud83c\udffb \uc544\ub798\ub294 \ube0c\ub77c\uc6b0\uc800\uc5d0 \uac04\ub2e8\ud55c \uba54\uc2dc\uc9c0\ub97c \ucd9c\ub825\ud569\ub2c8\ub2e4.The following outputs a simple message to the browser. \ud83d\udc49\ud83c\udffb \uc124\uba85\uc740 \ucf54\ub4dc\uc8fc\uc11d\uc744 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,1],"tags":[],"class_list":["post-5429","post","type-post","status-publish","format-standard","hentry","category-cpp","category-uncategorized","missing-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/5429","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/comments?post=5429"}],"version-history":[{"count":1,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/5429\/revisions"}],"predecessor-version":[{"id":5432,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/5429\/revisions\/5432"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=5429"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=5429"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=5429"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}