{"id":7840,"date":"2026-08-13T11:40:58","date_gmt":"2026-08-13T02:40:58","guid":{"rendered":"https:\/\/www.freelifemakers.org\/wordpress\/?p=7840"},"modified":"2026-08-14T10:50:59","modified_gmt":"2026-08-14T01:50:59","slug":"nextjs-sns-server-2","status":"publish","type":"post","link":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/2026\/08\/13\/nextjs-sns-server-2\/","title":{"rendered":"[nextjs]SNS Server-2"},"content":{"rendered":"\n<p>\ud83d\udc49\ud83c\udffb freelifemaker.com(gotosocial)\uc11c\ubc84\uc5d0\uc11c \ub098\uc758 nextjs\uc11c\ubc84\ub85c \ud314\ub85c\uc6cc\ud558\ub294\uae30\ub2a5\uc744 \uad6c\ud604\ud558\ub294 \uacfc\uc815\uc744 \uc124\uba85\ud569\ub2c8\ub2e4.<br>This explains the process of implementing a follower feature from the freelifemaker.com (GoToSocial) server to my Next.js server.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574\uc11c\ub294 \uc2e4\uc81c\ub85c \ub3c4\uba54\uc778\uc774 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4.<br>To perform the test, the domain must actually be connected.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb \uadf8\ub798\uc11c ddns\ub85c \ub3c4\uba54\uc778 \uc5f0\uacb0\uc744 \ud569\ub2c8\ub2e4.<br>So, I connect the domain using DDNS.<\/p>\n\n\n\n<p>\ud83d\udc49\ud83c\udffb https\ub294 \uc55e\uc804\uc5d0 \uc124\uba85\ud588\ub358 caddy\ub97c \uc0ac\uc6a9\ud558\uba74\ub429\ub2c8\ub2e4.<br>For HTTPS, you can use Caddy, which I explained earlier.<\/p>\n\n\n\n<p>\ud83d\udcc1 Actor,Inbox,Outbox<\/p>\n\n\n\n<p>\u2714\ufe0f ActivityPub SNS\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uac04\ub2e8\ud55c \uc6a9\uc5b4 \uc785\ub2c8\ub2e4.<br>These are simple terms used in ActivityPub-based social networks.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Actor (\uc0ac\ub78c) : \n- https:\/\/yourhost.domain.org\/users\/usename\n- Actor\ub294 \uc0ac\uc6a9\uc790\ub97c \uc758\ubbf8\ud569\ub2c8\ub2e4.\n\"Actor\" refers to the user.\n\nInbox (\uc6b0\ud3b8\ud568 \/ mailbox) : \n- \uc77c\uc885\uc758 \uc6b0\ud3b8\ud568\uc73c\ub85c \ub0a8\uc774 \ub098\ud55c\ud14c \ud3b8\uc9c0 \ubcf4\ub0b4\ub294 \uacf3\uc785\ub2c8\ub2e4.\nIt is a kind of mailbox where others can send me letters.\n\nOutbox (\ubc1c\uc2e0\ud568 \/ Outbox) : \n- \ub0b4\uac00 \uc4f4 \uae00 \ubaa9\ub85d\uc774 \uc800\uc7a5\ub418\ub294 \uacf3\uc785\ub2c8\ub2e4.\nThis is where the list of posts I have written is stored.<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \uc9c4\ud589\uacfc\uc815\uc744 \uc694\uc57d\ud558\uba74 \uc544\ub798\uc640 \uac19\uc2b5\ub2c8\ub2e4.<br>The process is summarized below.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>1, \ud0a4 \uc0dd\uc131 \/ Key Generation\n\n- ActivityPub\uc740 \uae00\uc744 \uc4f8\ub54c \ud0a4\ub85c \uac80\uc99d \ud574\uc57c\ud569\ub2c8\ub2e4.\nWith ActivityPub, you must verify using a key when creating a post.\n\n- private key\uc640 \ud568\uaed8 \ubcf4\ub0b4\uba74 \uc0c1\ub300\ubc29 \uc11c\ubc84\uac00 \ub0b4 \uc11c\ubc84\uc5d0 public key \uc694\uccad\ud574\uc11c \uac80\uc99d\ud569\ub2c8\ub2e4.\nWhen sent along with the private key, the recipient's server requests the public key from my server to verify it.\n\n- private key\ub294 \ube44\uacf5\uac1c \ud0a4,public key\ub294 actor\uc5d0\uac8c \uacf5\uac1c\ud558\ub294 \ud0a4\uc785\ub2c8\ub2e4.\nA private key is a key that is kept secret, while a public key is a key disclosed to the actor.\n\n2. DB\uc5d0 followers \ud14c\uc774\ube14 \ucd94\uac00\nAdd a 'followers' table to the database.\n\n- lib\/db.ts\uc5d0 followers \ud14c\uc774\ube14 \ucd94\uac00\ud569\ub2c8\ub2e4.\nAdd the `followers` table to `lib\/db.ts`.\n\n- \ub204\uac00 \ub098\ub97c \ud314\ub85c\uc6b0 \ud588\ub294\uc9c0 inbox \uc8fc\uc18c \uc800\uc7a5\uc6a9\uc73c\ub85c \uc0ac\uc6a9\ub429\ub2c8\ub2e4.\nIt is used to store the inbox address of the person who followed me.\n\n3.\ub77c\uc6b0\ud2b8 \ub9cc\ub4e4\uae30 \/ Creating a Route\n\n- Actor \uac80\uc0c9\uc2dc \uc8fc\uc18c \uc54c\ub824\uc8fc\uae30\nProvide the address when searching for an actor.\n\/.well-known\/webfinger\/route.ts \n\n- \ub0b4\uc774\ub984,inbox,\uacf5\uac1c\ud0a4 \uc54c\ub824\uc8fc\uae30\nShare my name, inbox, and public key.\n\/users\/&#91;username]\/route.ts \n\n- Follow\ubc1b\uae30,\uc0c1\ub300\ubc29 \uae00\uc744 \ubc1b\ub294 \uc6b0\ud3b8\ud568\n\"Follow\" \u2014 an inbox for receiving posts from others.\n\/users\/&#91;username]\/inbox\/route.ts \n\n- \ub0b4\uac00 \uc4f4 \uae00 \ubaa9\ub85d\nList of posts I've written\n\/users\/&#91;username]\/outbox\/route.ts\n\n4.\ud314\ub85c\uc6b0\ud558\uae30 \/ Follow\n\n- yourhost.domain.org \uc11c\ubc84\uc2e4\ud589(\ub610\ub294 \ubc30\ud3ec)\nRun (or deploy) the server on yourhost.domain.org\n\n- GTS(pinafore.social)\uc5d0\uc11c @user1@yourhost.domain.org \uac80\uc0c9\nSearch for @user1@yourhost.domain.org on GTS(pinafore.social).\n\n\n5.GTS(Pinafore)\uc5d0\uc11c followers 1 \ub9cc\ub4e4\uae30\nCreating 1 follower in GTS (Pinafore)\n\n- yourhost.domain.org \ud314\ub85c\uc6b0\ud558\uae30\nFollow yourhost.domain.org\n\n- lib\/ap.ts\uc5d0\uc11c private.pem\uc73c\ub85c \uc11c\uba85\ud574\uc11c Accept\ub97c GTS inbox\ub85c POST\uc804\uc1a1 \ud558\uae30\nSign the \"Accept\" activity with `private.pem` and send it via POST to the GTS inbox in `lib\/ap.ts`.\n\n- GTS 202 Accepted \n<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \uc804\uccb4 \ud504\ub85c\uc81d\ud2b8 \uad6c\uc870 \/ Project Structure<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>myapp12\/  \n\u251c\u2500\u2500 app\/  (Next.js App Router)\n\u2502   \u251c\u2500\u2500 api\/posts\/route.ts     -> \uae00 \uc4f0\uae30 API \/ Writing API\n\u2502   \u251c\u2500\u2500 users\/&#91;username]\/\n\u2502   \u2502   \u251c\u2500\u2500 route.ts           -> Actor\uc815\ubcf4 \/ Acotr Information\n\u2502   \u2502   \u251c\u2500\u2500 inbox\/route.ts     -> Inbox\n\u2502   \u2502   \u2514\u2500\u2500 outbox\/route.ts    -> outbox\n\u2502   \u251c\u2500\u2500 layout.tsx, page.tsx, globals.css\n\u2502   \u2514\u2500\u2500 favicon.ico\n\u251c\u2500\u2500 lib\/\n\u2502   \u251c\u2500\u2500 ap.ts                  -> Follow Accept\n\u2502   \u2514\u2500\u2500 db.ts                  -> DB connection\n\u251c\u2500\u2500 data\/\n\u2502   \u2514\u2500\u2500 keys\/                  -> private.pem, public.pem\n\u251c\u2500\u2500 data.sqlite                -> Database\n\u251c\u2500\u2500 Caddyfile                  -> https \n\u2514\u2500\u2500 package.json<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131 \/ Create Project (myapp12)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npx create-next-app@latest<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 SQLite\uc124\uce58 \/ Installing SQLite<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/myapp11\nnpm install better-sqlite3\nnpm install -D @types\/better-sqlite3<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 caddy \uc124\uce58 \/ Install Caddy<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>brew install caddy<\/code><\/pre>\n\n\n\n<p>\ud83d\udcc1 \ucf54\ub4dc \uc791\uc131<br>Writing Code<\/p>\n\n\n\n<p>\u2714\ufe0f 1. \ud0a4 \uc0dd\uc131 (ActivityPub\uc740 \ubaa8\ub4e0 \uc694\uccad\uc5d0 \uc11c\uba85\uc744 \ud569\ub2c8\ub2e4.)<br>Key Generation (ActivityPub signs all requests.)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>cd ~\/myapp12\n\n# \ud0a4 \ud3f4\ub354 \/ key folder\nmkdir -p data\/keys\nopenssl genrsa -out data\/keys\/private.pem 2048\nopenssl rsa -in data\/keys\/private.pem -pubout -out data\/keys\/public.pem\necho \"data\/\" >> .gitignore<\/code><\/pre>\n\n\n\n<p>1)\ud0a4\ub294 \ub0b4\uac00 \uc694\uccad \uc218\ub77d\ud560\ub54c privatekey\uc640 \ud568\uaed8 \ud314\ub85c\uc6cc\ub97c \uc694\uccad\ud55c \uc0c1\ub300\ubc29 \uc11c\ubc84\uc5d0 \ubcf4\ub0c5\ub2c8\ub2e4.<br>When I accept a request, the key is sent\u2014along with the private key\u2014to the server of the person who requested to follow.<\/p>\n\n\n\n<p>2)\uc0c1\ub300\ubc29\uc774 \uc11c\ubc84\uac00 \ub0b4 \uc11c\ubc84\uc5d0\uc11c publickey\ub85c \ub0b4\uac00 \ubcf4\ub0b8 privatekey\uc640 \ub9de\ub294\uc9c0 \ud655\uc778\ud574 \ubd05\ub2c8\ub2e4.<br>The remote server checks whether the private key I sent matches the public key on my server.<\/p>\n\n\n\n<p>\u2714\ufe0f 2. DB\uc5d0 followers \ud14c\uc774\ube14 \ucd94\uac00<br>Add a &#8216;followers&#8217; table to the database.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>db.exec(`\n  CREATE TABLE IF NOT EXISTS followers (\n    id TEXT PRIMARY KEY,\n    actor TEXT NOT NULL,\n    inbox TEXT NOT NULL\n  );\n`);<\/code><\/pre>\n\n\n\n<p>\u2714\ufe0f 3.\ub77c\uc6b0\ud2b8 \ub9cc\ub4e4\uae30 \/ Creating a Route<\/p>\n\n\n\n<p>file 1:\u00a0<code>app\/.well-known\/webfinger\/route.ts<\/code><\/p>\n\n\n\n<p>file 2:\u00a0<code>app\/users\/[username]\/route.ts<\/code><\/p>\n\n\n\n<p>file 3:\u00a0<code>app\/users\/[username]\/inbox\/route.ts<\/code>\u00a0<\/p>\n\n\n\n<p>file 4:\u00a0<code>app\/users\/[username]\/outbox\/route.ts<\/code><\/p>\n\n\n\n<p>\u2714\ufe0f 4. \ud314\ub85c\uc6b0\ud558\uae30 \/ Follow<\/p>\n\n\n\n<p>&#8212; <a href=\"https:\/\/pinafore.social\/\">https:\/\/pinafore.social\/<\/a> \uc5d0\uc11c \ub0b4 \uc11c\ubc84\uc758 \uac80\uc0c9\uc774 \uac00\ub2a5\ud558\uac8c\ud558\ub824\uba74 webfinger\uc640 Actor\ud655\uc778\uc774 \uac00\ub2a5\ud574\uc57c \ud569\ub2c8\ub2e4.<br>To enable searching for your server on https:\/\/pinafore.social\/, WebFinger and Actor verification must be supported.<\/p>\n\n\n\n<p>&#8212; webfinger \ud14c\uc2a4\ud2b8(user1\uc774 \uc788\ub294 \uc9c0 \ud655\uc778\ud558\uae30)<br>WebFinger test (check if user1 exists)<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># webfinper\ud14c\uc2a4\ud2b8 \/ WebFinger test \nmyapp12 % <strong>curl \"http:\/\/localhost:3000\/.well-known\/webfinger?resource=acct:user1@yourhost.domain.org\"<\/strong>\n\n# \uc751\ub2f5 \/ Response\n{\"subject\":\"acct:user1@yourhost.doman.org\",\"links\":&#91;{\"rel\":\"self\",\"type\":\"application\/activity+json\",\"href\":\"https:\/\/yourhost.domain.org\/users\/user1\"}]}% <\/code><\/pre>\n\n\n\n<p>&#8212; Actor\ud655\uc778\ud558\uae30 \/ Check Actor<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>#  HTML \ub9d0\uace0 application\/activity+json \ud615\ud0dc\ub85c \ub41c JSON\uc73c\ub85c \uc694\uccad\ud558\uae30\nMake the request using JSON in the `application\/activity+json` format instead of HTML.\nmyapp12 %  <strong>curl -H \"Accept: application\/activity+json\" \"http:\/\/localhost:3000\/users\/user1\"<\/strong>\n\n# \uc751\ub2f5 \/ Response\n{\n  \"id\": \"https:\/\/aloy-horizon.duckdns.org\/users\/user1\",\n  \"type\": \"Person\",\n  \"preferredUsername\": \"user1\",\n  \"inbox\": \"https:\/\/aloy-horizon.duckdns.org\/users\/user1\/inbox\",\n  \"outbox\": \"https:\/\/aloy-horizon.duckdns.org\/users\/user1\/outbox\",\n  \"publicKey\": { \"publicKeyPem\": \"-----BEGIN PUBLIC KEY-----...\" }\n}<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>id<\/code>: \ub0b4 \uc8fc\uc18c \/ My address<\/li>\n\n\n\n<li><code>type: Person<\/code> (Bot, Service\ub3c4 \uac00\ub2a5 \/ Bots and services are also supported.)<\/li>\n\n\n\n<li><code>preferredUsername<\/code>: \ub0b4 \uc774\ub984 \/ My name (user1)<\/li>\n\n\n\n<li><code>inbox<\/code>: Follow, \uae00 \ubc30\ub2ec \ubc1b\ub294 \uacf3 \/ Where to receive the writings<\/li>\n\n\n\n<li><code>outbox<\/code>:\u00a0\ub0b4\uac00 \uc4f4 \uae00,\ub0b4 \ud0c0\uc784\ub77c\uc778 \/ My posts, my timeline<\/li>\n\n\n\n<li><code>publicKey<\/code>: \uac80\uc99d\ud558\uae30 \uc704\ud55c \ud0a4 \/ Key for verification<\/li>\n<\/ul>\n\n\n\n<p>\ud83d\udcc1 \uc2e4\ud589 \/ Run<\/p>\n\n\n\n<p>&#8212; Nextjs\uc11c\ubc84 \uc2e4\ud589 \/ Run NextJS Server<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>npm run dev<\/code><\/pre>\n\n\n\n<p>&#8212; Caddy \uc2e4\ud589<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Caddy start<\/code><\/pre>\n\n\n\n<p>&#8212; pinafore.social\uc5d0\uc11c \uac80\uc0c9\ud574\uc11c \ub0b4\uc11c\ubc84\uac00 \uac80\uc0c9\ub418\ub294\uc9c0 \ud655\uc778\ud574 \ubcf4\uae30<br>Search on pinafore.social to see if my server shows up in the results.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"482\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-usersearch-jpg.jpg\" alt=\"\" class=\"wp-image-7921\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-usersearch-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-usersearch-jpg-300x181.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-usersearch-jpg-768x463.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-usersearch-jpg-400x241.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">search<\/figcaption><\/figure>\n\n\n\n<p>&#8212; freelifemakers.com \uacc4\uc815\uc73c\ub85c \ub85c\uadf8\uc778\ud574\uc11c \uac80\uc0c9\ub41c \ub0b4 sns\uc11c\ubc84\uc5d0 \ud314\ub85c\uc6b0\ud558\uae30<br>Log in with your freelifemakers.com account and follow the discovered SNS server.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"755\" src=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-follow-jpg.jpg\" alt=\"\" class=\"wp-image-7922\" srcset=\"https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-follow-jpg.jpg 800w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-follow-jpg-300x283.jpg 300w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-follow-jpg-768x725.jpg 768w, https:\/\/www.freelifemakers.org\/wordpress\/wp-content\/uploads\/2026\/08\/myapp12-follow-jpg-400x378.jpg 400w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"wp-element-caption\">Followers<\/figcaption><\/figure>\n\n\n\n<p>&#8212; pinafore.social\uc5d0\uc11c \ud314\ub85c\uc6b0\uac00 \ub418\uace0 \ud314\ub85c\uc6cc\uac00 1\uc774\ub418\ub294 \ub85c\uc9c1\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<br>The logic for gaining a follower on pinafore.social is as follows.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\nexport async function POST(req: Request, { params }: { params: Promise&lt;{ username: string }> }) {\n  const { username } = await params;\n  try {\n    const body = await req.json();\n    console.log(`\ud83d\udce9 &#91;${username}] INBOX:`, body.type, body.actor);\n\n    \/\/ \uc0c1\ub300\ubc29 public\ud0a4\ub85c \uac80\uc99d, \ud14c\uc2a4\ud2b8 \ubd80\ubd84\uc774\ub77c \uc81c\uc678 \uc2dc\ud0b4\n    \/\/ Verification using the other party's public key\u2014excluded as it is part of the testing phase.\n    \/\/ const actorUrl = body.actor;\n    \/\/ const actorData = await fetch(actorUrl, {\n    \/\/   headers: { Accept: 'application\/activity+json' }\n    \/\/ }).then(r => r.json());\n    \n    \/\/ const publicKeyPem = actorData.publicKey.publicKeyPem;\n    \/\/ const isValid = verify(req, publicKeyPem); \n\n    \/\/ if (!isValid) return Response.json({}, { status: 401 });\n\n    const actorId = typeof body.actor === 'string' ? body.actor : body.actor?.id;\n    const actorInbox = typeof body.actor === 'object' ? body.actor?.inbox : null;\n\n    if (body.type === 'Follow') {\n      const inboxUrl = actorInbox || `${actorId}\/inbox`;\n      db.prepare('INSERT OR IGNORE INTO followers (id, actor, inbox) VALUES (?,?,?)')\n        .run(body.id, actorId, inboxUrl);\n      console.log(`\u2705 &#91;${username}] \ud314\ub85c\uc6b0 \uc800\uc7a5 \/ follow save : ${actorId}`);\n\n      \/\/ Accept \ube44\ub3d9\uae30\ub85c \uc804\uc1a1 (\uc751\ub2f5 \ube68\ub9ac \uc8fc\ub824\uace0) \/ Send Accept asynchronously (to respond quickly)\n      sendAccept(inboxUrl, body, username).catch(e => console.error('Accept \uc2e4\ud328:', e));\n    }\n\n    return new Response('', { status: 202 });\n  } catch (e) {\n    console.error('inbox \uc5d0\ub7ec \/ inbox error:', e);\n    return new Response('', { status: 202 });\n  }\n}<\/code><\/pre>\n\n\n\n<p>1)@user1@yourhost.domain.org \uc5d0 \ud314\ub85c\uc6b0 \ud558\ub294 \uc0ac\ub78c\uc758 \uc815\ubcf4\ub97c \uc800\uc7a5\ud569\ub2c8\ub2e4.<br>Stores information about people following @user1@yourhost.domain.org.<\/p>\n\n\n\n<p>2)freelifemakers.com (GoToSocial \uc11c\ubc84)\uc5d0 \ub0b4\uac00 \ub204\uad74 \ud314\ub85c\uc6b0\ud558\ub294 \uac74\uc9c0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<br>It stores who I am following on the freelifemakers.com (GoToSocial) server.<\/p>\n\n\n\n<p>3)\uadf8\ub798\uc11c \uc2e4\uc81c\ub85c \ud314\ub85c\uc6cc \uc22b\uc790\ub294 freelifemakers.com\uc11c\ubc84\uc758 \uc815\ubcf4\ub97c \ubcf4\uc5ec\uc8fc\ub294 \uac81\ub2c8\ub2e4.<br>So, the actual follower count reflects the information from the freelifemakers.com server.<\/p>\n\n\n\n<p>4) pinafore\uc5d0\uc11c \ud314\ub85c\uc6b0 \uc544\uc774\ucf58\uc774 \ubc14\ub00c\ub294\uac83\ub3c4 freelifemakers.com\uc11c\ubc84\uc758 \uc815\ubcf4\ub97c \ud1b5\ud574\uc11c \ubc14\ub00c\ub294 \uac81\ub2c8\ub2e4.<br>The change of the &#8220;Follow&#8221; icon in Pinafore is also driven by information from the freelifemakers.com server.<\/p>\n\n\n\n<p>5) \ub0b4\uc11c\ubc84\uc5d0 \uc800\uc7a5\ud558\ub294 \uc815\ubcf4\ub294 \uc0c1\ub300\ubc29 \uc11c\ubc84\uc5d0 \uae00\uc744 \ubc30\ub2ec\ud558\uae30 \uc704\ud574 \ud544\uc694\ud55c \uc815\ubcf4\uc785\ub2c8\ub2e4.<br>The information stored on my server is what is required to deliver the post to the recipient&#8217;s server.<\/p>\n\n\n\n<p>4)\uc704\uc758 \ucf54\ub4dc\uc5d0\uc11c\ub294 public key\uc694\uccad\ud558\ub294 \ucf54\ub4dc\uac00 \ube60\uc838 \uc788\uc2b5\ub2c8\ub2e4. <br>The code for requesting the public key is missing from the code above.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud83d\udc49\ud83c\udffb freelifemaker.com(gotosocial)\uc11c\ubc84\uc5d0\uc11c \ub098\uc758 nextjs\uc11c\ubc84\ub85c \ud314\ub85c\uc6cc\ud558\ub294\uae30\ub2a5\uc744 \uad6c\ud604\ud558\ub294 \uacfc\uc815\uc744 \uc124\uba85\ud569\ub2c8\ub2e4.This explains the process of implementing a follower feature from the freelifemaker.com (GoToSocial) server to my Next.js server. \ud83d\udc49\ud83c\udffb \ud14c\uc2a4\ud2b8\ub97c \uc704\ud574\uc11c\ub294 \uc2e4\uc81c\ub85c \ub3c4\uba54\uc778\uc774 \uc5f0\uacb0\ub418\uc5b4 \uc788\uc5b4\uc57c\ud569\ub2c8\ub2e4.To perform the test, the domain must actually be connected. \ud83d\udc49\ud83c\udffb \uadf8\ub798\uc11c ddns\ub85c \ub3c4\uba54\uc778 \uc5f0\uacb0\uc744 \ud569\ub2c8\ub2e4.So, I connect the domain using DDNS. \ud83d\udc49\ud83c\udffb https\ub294 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,1,7],"tags":[],"class_list":["post-7840","post","type-post","status-publish","format-standard","hentry","category-nextjs","category-uncategorized","category-website","missing-thumbnail"],"_links":{"self":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7840","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=7840"}],"version-history":[{"count":86,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7840\/revisions"}],"predecessor-version":[{"id":7930,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/posts\/7840\/revisions\/7930"}],"wp:attachment":[{"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/media?parent=7840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/categories?post=7840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.freelifemakers.org\/wordpress\/index.php\/wp-json\/wp\/v2\/tags?post=7840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}