{"id":5359,"date":"2018-06-28T07:00:12","date_gmt":"2018-06-28T14:00:12","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=5359"},"modified":"2025-06-13T18:32:52","modified_gmt":"2025-06-14T01:32:52","slug":"jwt-authentication-with-graphql-node-js-and-couchbase-nosql","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/ko\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/","title":{"rendered":"GraphQL, Node.js \ubc0f Couchbase NoSQL\uc744 \uc0ac\uc6a9\ud55c JWT \uc778\uc99d"},"content":{"rendered":"<p>\uba87 \ub2ec \uc804 GraphQL\uc5d0 \ub300\ud574 \ucc98\uc74c \ubc30\uc6b0\uae30 \uc2dc\uc791\ud588\uc744 \ub54c, \uc800\ub294 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/creating-a-graphql-application-with-node-js-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">\uc774\uc804 \ud29c\ud1a0\ub9ac\uc5bc<\/a> \ub97c \uc0ac\uc6a9\ud558\uc5ec Couchbase \ubc0f Node.js\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc740 GraphQL \uac1d\uccb4\ub97c \ub9cc\ub4e4\uace0 NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0\uc11c \ud574\ub2f9 \uac1d\uccb4\ub97c \ucffc\ub9ac\ud558\ub294 \ub4f1 \uae30\ubcf8 \uc0ac\ud56d\uc5d0 \uc911\uc810\uc744 \ub450\uc5c8\uc2b5\ub2c8\ub2e4, <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/\" target=\"_blank\" rel=\"noopener noreferrer\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a>. \uc870\uae08 \uc55e\uc73c\ub85c \ub098\uc544\uac00\uc11c \uc800\ub294 \ud29c\ud1a0\ub9ac\uc5bc\uc744 \uc791\uc131\ud588\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2018\/05\/getting-started-graphql-development-nodejs\/\" target=\"_blank\" rel=\"noopener noreferrer\">\ub300\uccb4 \ubc29\ubc95<\/a> \ub370\uc774\ud130\ubca0\uc774\uc2a4 \uacc4\uce35\uc774 \uac15\uc870\ub418\uc9c0 \uc54a\uc558\uc74c\uc5d0\ub3c4 \ubd88\uad6c\ud558\uace0 Node.js\uc640 \ud568\uaed8 GraphQL\uc744 \uc0ac\uc6a9\ud558\ub3c4\ub85d \ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>API\ub97c \uc0ac\uc6a9\ud558\uac70\ub098 \ub9cc\ub4e4 \ub54c \ubaa8\ub4e0 \uc0ac\ub78c\uc774 \ubaa8\ub4e0 \ub370\uc774\ud130\uc5d0 \uc561\uc138\uc2a4\ud558\ub294 \uac83\uc744 \uc6d0\ud558\uc9c0 \uc54a\ub294 \uc2dc\ub098\ub9ac\uc624\uac00 \uc885\uc885 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc2dc\ub098\ub9ac\uc624\uc5d0\uc11c\ub294 \uad8c\ud55c \ubd80\uc5ec \ubc0f API \ud1a0\ud070\uc744 \ud1b5\ud574 \uc77c\uc885\uc758 \uaddc\uc81c\uac00 \ud544\uc694\ud560 \uac83\uc785\ub2c8\ub2e4. RESTful API\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \uc774 \uc791\uc5c5\uc740 JSON \uc6f9 \ud1a0\ud070(JWT)\uc744 \ud1b5\ud574 \uc27d\uac8c \uc218\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>JWT\ub97c \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/graphql.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">GraphQL<\/a> \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc804\uccb4 \ub610\ub294 \uc77c\ubd80 \ub370\uc774\ud130\uac00 \uc544\ub2cc \ud2b9\uc815 \ub370\uc774\ud130\ub97c \ubcf4\ud638\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><!--more--><\/p>\n<p>\uc55e\uc73c\ub85c\ub294 JSON \uc6f9 \ud1a0\ud070(JWT)\uc774 \uc5b4\ub5bb\uac8c \uc791\ub3d9\ud558\ub294\uc9c0\uc5d0 \ub300\ud574 \uc5b4\ub290 \uc815\ub3c4 \uc774\ud574\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \ube60\ub978 \uc2dc\uc791 \uac00\uc774\ub4dc\ub97c \ud655\uc778\ud558\uace0 \uc2f6\uc73c\uc2dc\ub2e4\uba74 \uc81c \ud29c\ud1a0\ub9ac\uc5bc\uc744 \ucc38\uc870\ud558\uc138\uc694,\u00a0<a href=\"https:\/\/www.thepolyglotdeveloper.com\/2017\/03\/jwt-authentication-in-a-node-js-powered-api\/\" target=\"_blank\" rel=\"noopener noreferrer\">Node.js \uae30\ubc18 API\uc758 JWT \uc778\uc99d<\/a>. \uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc758 \ucd08\uc810\uc740 GraphQL\uc774 \uc544\ub2c8\uc9c0\ub9cc \uc5ec\uc804\ud788 \uc88b\uc740 \uc2dc\uc791\uc810\uc73c\ub85c \uc791\ub3d9\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc758 \ubaa9\ud45c\ub294 GraphQL\uc744 \uc0ac\uc6a9\ud558\ub294 API\ub97c \ub9cc\ub4dc\ub294 \uac83\uc785\ub2c8\ub2e4. \uacc4\uc815\uc744 \ub9cc\ub4e4\uace0, \ud1a0\ud070\uc744 \uc5bb\uace0, \ud574\ub2f9 \ud1a0\ud070\uc744 \uc0ac\uc6a9\ud558\uc5ec API\uc758 \ubcf4\ud638\ub41c \ubd80\ubd84\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c\ub294 Couchbase \uc124\uce58 \ubc0f \uad6c\uc131\uc5d0 \ub300\ud55c \uc9c0\uce68\uc740 \ub2e4\ub8e8\uc9c0 \uc54a\uc9c0\ub9cc \ud638\ud658\uc131\uc744 \uc704\ud574 \ud2b9\ubcc4\ud788 \uc218\ud589\ud574\uc57c \ud560 \uc791\uc5c5\uc740 \uc5c6\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\ud504\ub85c\uc81d\ud2b8 \uc885\uc18d\uc131\uc774 \uc788\ub294 \uc0c8 Node.js \uc560\ud50c\ub9ac\ucf00\uc774\uc158 \ub9cc\ub4e4\uae30<\/h2>\n<p>\ud504\ub85c\uc81d\ud2b8\uc758 \ub354 \ubb34\uac81\uace0 \ubcf5\uc7a1\ud55c \ubd80\ubd84\uc73c\ub85c \ub4e4\uc5b4\uac00\uae30 \uc804\uc5d0 \ubaa8\ub4e0 \uc885\uc18d\uc131\uacfc \uc0c1\uc6a9\uad6c \ucf54\ub4dc\uac00 \ud3ec\ud568\ub41c \uc0c8 \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uc5b4 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \uc774\ubbf8 Node.js\uac00 \uc124\uce58 \ubc0f \uad6c\uc131\ub418\uc5c8\ub2e4\uace0 \uac00\uc815\ud558\uace0 CLI\uc5d0\uc11c \ub2e4\uc74c\uc744 \uc2e4\ud589\ud569\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">npm init -y\r\nnpm install express --save\r\nnpm install express-graphql --save\r\nnpm install graphql --save\r\nnpm install jsonwebtoken --save\r\nnpm install uuid --save\r\nnpm install couchbase --save\r\nnpm install body-parser --save\r\nnpm install bcryptjs --save<\/pre>\n<p>\uc704\uc758 \uba85\ub839\uc740 \uc0c8\ub85c\uc6b4\u00a0<strong>package.json<\/strong> \ud30c\uc77c\uc744 \uc5f4\uace0 \ud544\uc694\ud55c \uac01 \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud558\uc138\uc694. \uc774\ub7ec\ud55c \ud328\ud0a4\uc9c0\uc5d0\ub294 GraphQL \ub77c\uc774\ube0c\ub7ec\ub9ac\uc640 Express \ud504\ub808\uc784\uc6cc\ud06c\uc6a9 GraphQL \ud655\uc7a5 \ud504\ub85c\uadf8\ub7a8\uc774 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c \ube44\ubc00\ubc88\ud638 \ub370\uc774\ud130\ub97c \ud574\uc2dc\ud558\uace0, JWT\ub97c \uc0dd\uc131\ud558\uace0, \ubaa8\ub4e0 \uac83\uc744 Couchbase\uc5d0 \uc800\uc7a5\ud558\ub294 \ubc29\ubc95\ub3c4 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc791\uc5c5\uc744 \ud55c \uc904\ub85c \ud560 \uc218 \uc788\uc5c8\ub098\uc694? \ub124, \ud558\uc9c0\ub9cc \ucabc\uac1c\uba74 \ub354 \uc77d\uae30 \uc26c\uc6b8 \uac83 \uac19\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud504\ub85c\uc81d\ud2b8\uac00 \uc0dd\uc131\ub418\uc5c8\uc73c\uba74 \uacc4\uc18d\ud574\uc11c\u00a0<strong>app.js<\/strong> \ud30c\uc77c\uc5d0 \ub2e4\uc74c \ucf54\ub4dc\uac00 \ud3ec\ud568\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">const Express = require(\"express\");\r\nconst Couchbase = require(\"couchbase\");\r\nconst BodyParser = require(\"body-parser\");\r\nconst JsonWebToken = require(\"jsonwebtoken\");\r\nconst Bcrypt = require(\"bcryptjs\");\r\nconst ExpressGraphQL = require(\"express-graphql\");\r\nconst GraphQLObjectType = require(\"graphql\").GraphQLObjectType;\r\nconst GraphQLID = require(\"graphql\").GraphQLID;\r\nconst GraphQLString = require(\"graphql\").GraphQLString;\r\nconst GraphQLSchema = require(\"graphql\").GraphQLSchema;\r\nconst GraphQLList = require(\"graphql\").GraphQLList;\r\nconst UUID = require(\"uuid\");\r\n\r\nvar cluster = \uc0c8\ub85c\uc6b4 Couchbase.Cluster(\"couchbase:\/\/localhost\");\r\ncluster.authenticate(\"example\", \"123456\");\r\nvar bucket = cluster.openBucket(\"example\");\r\n\r\nvar app = Express();\r\n\r\napp.use(BodyParser.json());\r\napp.set(\"jwt-secret\", \"polyglotdeveloper\");\r\n\r\napp.use(\"\/graphql\", ExpressGraphQL({\r\n    graphiql: true\r\n}));\r\n\r\napp.post(\"\/register\", (\uc694\uccad, \uc751\ub2f5) =&gt; { });\r\n\r\napp.post(\"\/login\", (\uc694\uccad, \uc751\ub2f5) =&gt; { });\r\n\r\napp.listen(3000, () =&gt; {\r\n    console.log(\"\uc218\uc2e0 \uc911 :3000\");\r\n});<\/pre>\n<p>\uc704\uc758 \ucf54\ub4dc\ub97c \uc0c1\uc6a9\uad6c \ucf54\ub4dc\ub77c\uace0 \ubd80\ub974\uaca0\uc2b5\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c \uba87 \uac00\uc9c0 \uc124\uc815\uc744 \ud558\ub294 \uac83\uc77c \ubfd0 \ucd5c\uc885 \ubaa9\ud45c\uc640\ub294 \uc804\ud600 \uad00\ub828\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\uc6b4\ub85c\ub4dc\ud55c \ud328\ud0a4\uc9c0\ub97c \uac00\uc838\uc624\uace0, Couchbase\uc5d0 \uc5f0\uacb0\uc744 \uc124\uc815\ud558\uace0, Express Framework\ub97c \uad6c\uc131\ud558\uace0, \uc5d4\ub4dc\ud3ec\uc778\ud2b8 3\uac1c\ub97c \uc815\uc758\ud558\uace0, \ud3ec\ud2b8 3000\uc5d0\uc11c \uc11c\ube44\uc2a4\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc81c\uac00 \uc0ac\uc6a9\ud55c \uc815\ubcf4\uac00 \uc544\ub2cc \uc5ec\ub7ec\ubd84\ub9cc\uc758 Couchbase \uc815\ubcf4\ub97c \uc0ac\uc6a9\ud558\uc138\uc694. \ub610\ud55c \ubcf4\uc548\uc744 \uac15\ud654\ud558\ub824\uba74 <code>jwt-secret<\/code> \ub530\ub77c\uc11c \uc5ec\ub7ec\ubd84\uc758 \ud1a0\ud070\uc740 \uc800\ubcf4\ub2e4 \ub35c \uc608\uce21 \uac00\ub2a5\ud55c \ubc29\uc2dd\uc73c\ub85c \ud574\uc2dc\ub429\ub2c8\ub2e4.<\/p>\n<h2>\ub85c\uadf8\uc778 \ubc0f \ub4f1\ub85d\uc744 \uc704\ud55c \uac04\ud3b8 \uacc4\uc815 API \uc5d4\ub4dc\ud3ec\uc778\ud2b8 \ub514\uc790\uc778\ud558\uae30<\/h2>\n<p>\uc0c1\uc6a9\uad6c \ucf54\ub4dc\ub97c \ubcf4\uba74 \ub4f1\ub85d\uacfc \ub85c\uadf8\uc778 \ubaa8\ub450\uc5d0 \ub300\ud55c \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uac00 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc6b0\ub9ac\uac00 \ud558\ub824\ub294 \uc77c\uc744 \ub2ec\uc131\ud558\ub294 \ubc29\ubc95\uc740 \uc5ec\ub7ec \uac00\uc9c0\uac00 \uc788\uc73c\uba70, \uc544\ub9c8\ub3c4 \uc81c \uc194\ub8e8\uc158\ubcf4\ub2e4 \ub354 \ub098\uc740 \ubc29\ubc95\ub3c4 \uc788\uc744 \uac83\uc785\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc800\ub294 \ubaa9\ud45c\uc5d0\uc11c \ub108\ubb34 \uba40\ub9ac \ubc97\uc5b4\ub098\uc9c0 \uc54a\uc73c\uba74\uc11c\ub3c4 \ub17c\ub9ac\uc801\uc774\uace0 \uad6c\ud604\ud558\uae30 \uc26c\uc6b4 \ubc29\ubc95\uc744 \ucc3e\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubd80\ud130 \uc2dc\uc791\ud558\uc5ec <code>\/\ub4f1\ub85d<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0\ub294 \ub2e4\uc74c\uc774 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">app.post(\"\/register\", (\uc694\uccad, \uc751\ub2f5) =&gt; {\r\n    var id = UUID.v4();\r\n    request.body.type = \"account\";\r\n    request.body.password = Bcrypt.hashSync(request.body.password, 10);\r\n    bucket.insert(id, request.body, (error, result) =&gt; { {\r\n        if(error) {\r\n            \ubc18\ud658 \uc751\ub2f5.\uc0c1\ud0dc(500).\ubcf4\ub0b4\uae30({ \ucf54\ub4dc: error.\ucf54\ub4dc, \uba54\uc2dc\uc9c0: error.\uba54\uc2dc\uc9c0 });\r\n        }\r\n        response.send(request.body);\r\n    });\r\n});<\/pre>\n<p>\uc0ac\uc6a9\uc790\uac00 \ub2e4\uc74c\uacfc \ud568\uaed8 POST \uc694\uccad\uc744 \ubcf4\ub0bc \ub54c <code>\uc0ac\uc6a9\uc790 \uc774\ub984<\/code> \uadf8\ub9ac\uace0 <code>\ube44\ubc00\ubc88\ud638<\/code> \ubcf8\ubb38\uc5d0\uc11c \uba3c\uc800 Couchbase \ubb38\uc11c \ud0a4\ub85c \uc0ac\uc6a9\ud560 \uc0c8 UUID\ub97c \uc0dd\uc131\ud55c \ub2e4\uc74c \ub2e4\uc74c\uacfc \uac19\uc774 Bcrypt\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc554\ud638\ub97c \ud574\uc2f1\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/hashing-passwords-stored-in-couchbase-server-with-nodejs\/\" target=\"_blank\" rel=\"noopener noreferrer\">\uc774\uc804\uc5d0 \uc2dc\uc5f0\ub41c<\/a> \uc81c\uac00 \uc791\uc131\ud55c \ud29c\ud1a0\ub9ac\uc5bc\uc5d0\uc11c<\/p>\n<p>\ud574\uc2dc\uac00 \uc0dd\uc131\ub418\uba74 \ud504\ub85c\ud544 \ub370\uc774\ud130\ub97c Couchbase\uc5d0 \uc800\uc7a5\ud558\uace0 \ubc18\ud658\ud569\ub2c8\ub2e4. \uc804\uccb4 \ubaa9\ud45c\ub294 <code>\/\ub4f1\ub85d<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 \uc778\uc99d\ud560 \ub370\uc774\ud130\ub97c \uc81c\uacf5\ud574\uc57c \ud569\ub2c8\ub2e4. \uc778\uc99d\uc744 \uc704\ud574 <code>\/\ub85c\uadf8\uc778<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc640 \uac19\uc774 \ud45c\uc2dc\ub429\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">app.post(\"\/login\", (\uc694\uccad, \uc751\ub2f5) =&gt; {\r\n    var statement = \"SELECT META(account).id, account.username, account.`password` FROM `\" + bucket._name + \"` AS account WHERE account.type = 'account' AND account.username = $username\";\r\n    var query = Couchbase.N1qlQuery.fromString(statement);\r\n    bucket.query(query, { \"username\": request.body.username }, (error, account) =&gt; {\r\n        if(error) {\r\n            \ubc18\ud658 \uc751\ub2f5.\uc0c1\ud0dc(500).\ubcf4\ub0b4\uae30({ \ucf54\ub4dc: \uc624\ub958.\ucf54\ub4dc, \uba54\uc2dc\uc9c0: \uc624\ub958.\uba54\uc2dc\uc9c0 });\r\n        }\r\n        Bcrypt.compare(request.body.password, account[0].password, function(error, result) {\r\n            if(error || !result) {\r\n                return response.status(401).send({ \"success\": false, \"message\": \"\uc798\ubabb\ub41c \uc0ac\uc6a9\uc790 \uc774\ub984 \ubc0f \ube44\ubc00\ubc88\ud638\" });\r\n            }\r\n            var token = JsonWebToken.sign(account[0].id, app.get(\"jwt-secret\"), {});\r\n            response.send({\"token\": token});\r\n        });\r\n    });\r\n});<\/pre>\n<p>\uc704 \ucf54\ub4dc\uc5d0\uc11c\ub294 \uc694\uccad\uacfc \ud568\uaed8 \uc804\ub2ec\ub41c \uc0ac\uc6a9\uc790 \uc774\ub984\uacfc \uc77c\uce58\ud558\ub294 \uc0ac\uc6a9\uc790 \uc774\ub984\uc774 \ud3ec\ud568\ub41c \ubb38\uc11c\ub97c \ucc3e\uae30 \uc704\ud574 N1QL \ucffc\ub9ac\ub97c \ub9cc\ub4e4\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 \uc885\ub958\uc758 SQL \uc778\uc81d\uc158 \uacf5\uaca9\uc744 \ubc29\uc9c0\ud558\uae30 \uc704\ud574 \ub9e4\uac1c\ubcc0\uc218\ud654\ub41c \ucffc\ub9ac\ub97c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ubb38\uc11c\uac00 \ubc1c\uacac\ub418\uba74 \uc800\uc7a5\ub41c \ud574\uc2dc\ub41c \ube44\ubc00\ubc88\ud638\ub97c \uc694\uccad\uacfc \ud568\uaed8 \uc804\ub2ec\ub41c \ube44\ubc00\ubc88\ud638\uc640 \ube44\uad50\ud569\ub2c8\ub2e4. \uc77c\uce58\ud558\uba74 \ube44\ubc00\ubc88\ud638\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uc544\uc774\ub514\uc5d0 \uc11c\uba85\ud558\uc5ec \ud5a5\ud6c4 \uc694\uccad\uc5d0 \uc0ac\uc6a9\ud560 JWT\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub450 \uac00\uc9c0 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\uc5d0\uc11c \uc8fc\ubaa9\ud574\uc57c \ud560 \uba87 \uac00\uc9c0 \uc0ac\ud56d\uc774 \uc788\uc2b5\ub2c8\ub2e4:<\/p>\n<ol>\n<li>\ub370\uc774\ud130 \uc720\ud6a8\uc131 \uac80\uc0ac\ub97c \uc218\ud589\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc774\uac83\uc740 \uc608\uc2dc\uc77c \ubfd0\uc774\uba70 \ub2e8\uc21c\ud558\uac8c \uc720\uc9c0\ud558\ub824\uace0 \ub178\ub825\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li>JWT\uc5d0 \ub9cc\ub8cc \uae30\ud55c\uc744 \uc124\uc815\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc77c\ubc18\uc801\uc73c\ub85c 1\uc2dc\uac04 \uc774\ub0b4\uc5d0 \ub9cc\ub8cc\ub418\ub3c4\ub85d \uc124\uc815\ud558\uc9c0\ub9cc \uc774\uac83\uc740 \uac04\ub2e8\ud55c \uc608\uc77c \ubfd0\uc785\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>\ud604\uc7ac\ub85c\uc11c\ub294 GraphQL\ub85c \uc544\ubb34\uac83\ub3c4 \ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\ub97c \uc0dd\uc131\ud558\uace0 JSON \uc6f9 \ud1a0\ud070\uc744 \uc5bb\uae30 \uc704\ud55c \uae30\ubc18\uc744 \ub9c8\ub828\ud588\uc744 \ubfd0\uc785\ub2c8\ub2e4. JWT\ub97c \uc0dd\uc131\ud558\uace0 \uc788\uc9c0\ub9cc \ud604\uc7ac\ub85c\uc11c\ub294 \uc815\ud655\ud55c\uc9c0 \uac80\uc99d\ud558\uc9c0 \uc54a\uace0 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>Express \ud504\ub808\uc784\uc6cc\ud06c \ud568\uc218\ub85c JSON \uc6f9 \ud1a0\ud070(JWT) \uc720\ud6a8\uc131 \uac80\uc0ac\ud558\uae30<\/h2>\n<p>\ubcf4\ud638\ub41c \ub370\uc774\ud130\ub85c \uc791\uc5c5\ud560 \ub54c\ub294 JWT\uac00 \uc788\ub294 \uac83\ub9cc\uc73c\ub85c\ub294 \ucda9\ubd84\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc11c\uba85\uc744 \ud655\uc778\ud558\uc5ec \ud1a0\ud070\uc774 \uc2e4\uc81c\ub85c \uc720\ud6a8\ud55c\uc9c0 \ud655\uc778\ud574\uc57c \ud569\ub2c8\ub2e4. \ub610\ud55c JWT\ub97c \uc804\ub2ec\ud558\uae30 \uc704\ud55c \uc194\ub8e8\uc158\ub3c4 \ud544\uc694\ud569\ub2c8\ub2e4.<\/p>\n<p>Express \ud504\ub808\uc784\uc6cc\ud06c\uc5d0\ub294 JSON \uc6f9 \ud1a0\ud070 \uc791\uc5c5\uc744 \uc704\ud55c \ubbf8\ub4e4\uc6e8\uc5b4\uac00 \uc788\uc9c0\ub9cc \ubb38\uc11c\uac00 \ubd80\uc871\ud558\ub2e4\ub294 \uac83\uc744 \uc54c\uc558\uc2b5\ub2c8\ub2e4. \ub300\uc2e0 \uc9c1\uc811 \uc720\ud6a8\uc131 \uac80\uc0ac\ub97c \uc704\ud55c \uba54\uc11c\ub4dc\ub97c \ub9cc\ub4dc\ub294 \uac83\uc774 \ub354 \uc26c\uc6cc \ubcf4\uc600\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc744 \uc0b4\ud3b4\ubcf4\uc138\uc694:<\/p>\n<pre class=\"lang:default decode:true\">app.use((request, response, next) =&gt; {\r\n    var authHeader = request.headers[\"authorization\"];\r\n    if(authHeader) {\r\n        var bearerToken = authHeader.split(\" \");\r\n        if(bearerToken.length == 2 &amp;&amp; bearerToken[0].toLowerCase() == \"bearer\") {\r\n            JsonWebToken.verify(bearerToken[1], app.get(\"jwt-secret\"), function(error, decodedToken) {\r\n                if(error) {\r\n                    return response.status(401).send(\"Invalid authorization token\");\r\n                }\r\n                request.decodedToken = decodedToken;\r\n                next();\r\n            });\r\n        } else {\r\n            next();\r\n        }\r\n    } else {\r\n        next();\r\n    }\r\n});<\/pre>\n<p>\uadf8\ub807\ub2e4\uba74 \uc704\uc758 \ucf54\ub4dc\uc5d0\uc11c\ub294 \ubb34\uc5c7\uc744 \ud558\uace0 \uc788\uc744\uae4c\uc694?<\/p>\n<p>\uc6b0\ub9ac\ub294 <code>app.use<\/code>\ub97c \uc124\uc815\ud558\uba74 \ubaa8\ub4e0 \uc694\uccad\uc5d0 \ub300\ud574 \uc774 \ud568\uc218\uac00 \ud638\ucd9c\ub429\ub2c8\ub2e4. \uc774 \ud568\uc218\uac00 \ud638\ucd9c\ub418\uba74 \ud604\uc7ac \uc694\uccad \ud5e4\ub354\ub97c \uc0b4\ud3b4\ubcf4\uace0 \uad8c\ud55c \ubd80\uc5ec \ud5e4\ub354\ub97c \ucc3e\uc2b5\ub2c8\ub2e4. \uad8c\ud55c \ubd80\uc5ec \ud5e4\ub354\uac00 \uc874\uc7ac\ud558\uba74 \ubb34\uae30\uba85 \ud1a0\ud070\uc778\uc9c0 \ud655\uc778\ud558\uace0 \uc2e4\uc81c \ud1a0\ud070 \uac12\uc744 \ud655\uc778\uc5d0 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc2e4\uc81c \ud1a0\ud070\uc740 JWT\uc785\ub2c8\ub2e4. \ud1a0\ud070\uc774 \uc720\ud6a8\ud558\uba74 \ub514\ucf54\ub529\ub41c \uac12\uc744 \uc694\uccad\uc5d0 \ucd94\uac00\ud558\uc5ec \ub2e4\uc74c \ub2e8\uacc4\uc758 \uc694\uccad\uc5d0\uc11c \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uac8c \ub429\ub2c8\ub2e4. \ud1a0\ud070\uc774 \uc5c6\uc73c\uba74 \uc544\ubb34 \uc77c\ub3c4 \uc77c\uc5b4\ub098\uc9c0 \uc54a\uc73c\ubbc0\ub85c \uac71\uc815\ud560 \ud544\uc694\uac00 \uc5c6\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 \ub370\uc774\ud130 \ud3ec\uc778\ud2b8\uac00 \ubcf4\ud638\ub418\ub294 \uac83\uc740 \uc544\ub2c8\ubbc0\ub85c \ub85c\uc9c1\uc740 \ud1a0\ud070\uc774 \uc874\uc7ac\ud558\ub294 \uacbd\uc6b0\uc5d0\ub9cc \ud1a0\ud070\uc744 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc694\uccad\uc5d0\uc11c JWT \ud1a0\ud070\uc744 \uac00\uc838\uc640\uc11c \uc720\ud6a8\uc131\uc744 \uac80\uc0ac\ud558\ub294 \ub354 \uc88b\uc740 \ubc29\ubc95\uc774 \uc788\ub098\uc694? \uc544\ub9c8\ub3c4 \uadf8\ub807\uaca0\uc9c0\ub9cc \uc704\uc758 \ucf54\ub4dc\ub294 \uc81c\uac00 \ud14c\uc2a4\ud2b8\ud588\uc744 \ub54c \uc791\ub3d9\ud588\uace0 \uadf8\ub9ac \ubcf5\uc7a1\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>GraphQL \ubc0f JavaScript\ub97c \uc0ac\uc6a9\ud558\uc5ec \ubd80\ubd84\uc801\uc73c\ub85c \ubcf4\ud638\ub418\ub294 API \uac1c\ubc1c\ud558\uae30<\/h2>\n<p>\uc774\uc81c JWT \ub85c\uc9c1\uc774 \ub9c8\ub828\ub418\uc5c8\uc73c\ubbc0\ub85c API \uac1c\ubc1c\uc5d0 \uc9d1\uc911\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\uc220\uc801\uc73c\ub85c <code>\/\ub85c\uadf8\uc778<\/code> \uadf8\ub9ac\uace0 <code>\/\ub4f1\ub85d<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub294 API\uc758 \uc77c\ubd80\uc774\uc9c0\ub9cc \ucd08\uc810\uc740 GraphQL\uc5d0 \ub9de\ucdb0\uc838 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ucffc\ub9ac\uc5d0 \ub300\ud574 \uac71\uc815\ud558\uae30 \uc804\uc5d0 GraphQL \uac1d\uccb4\uc5d0 \ub300\ud574 \uc9d1\uc911\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">const AccountType = new GraphQLObjectType({\r\n    \uc774\ub984: \"\uacc4\uc815\",\r\n    fields: {\r\n        id: { type: GraphQLID },\r\n        \uc0ac\uc6a9\uc790 \uc774\ub984: { type: GraphQLString },\r\n        password: { type: GraphQLString }\r\n    }\r\n});\r\n\r\nconst CourseType = new GraphQLObjectType({\r\n    \uc774\ub984: \"\ucf54\uc2a4\",\r\n    fields: {\r\n        id: { type: GraphQLID },\r\n        title: { type: GraphQLString },\r\n        length: { type: GraphQLString },\r\n        author: {\r\n            type: \uacc4\uc815 \uc720\ud615\r\n        }\r\n    }\r\n});<\/pre>\n<p>\uc81c <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/creating-a-graphql-application-with-node-js-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">\uc774\uc804 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\uc640 \uadf8\ub798\ud504QL \ud29c\ud1a0\ub9ac\uc5bc<\/a>\ub97c \uc0ac\uc6a9\ud558\uba74 \uc704\uc758 \uac1c\uccb4\ub4e4\uc774 \uc870\uae08 \ub2e4\ub974\uac8c \ubcf4\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub294 \uc81c\uac00 \ub9cc\ub4e0 <a href=\"https:\/\/www.thepolyglotdeveloper.com\/2018\/05\/getting-started-graphql-development-nodejs\/\" target=\"_blank\" rel=\"noopener noreferrer\">\ub300\uccb4 GraphQL \ud29c\ud1a0\ub9ac\uc5bc<\/a>. \uae30\ubcf8\uc801\uc73c\ub85c \ud558\ub098\ub294 \uacc4\uc815 \ub370\uc774\ud130\uc6a9\uc774\uace0 \ub2e4\ub978 \ud558\ub098\ub294 \ucf54\uc2a4 \ub370\uc774\ud130\uc6a9\uc778 \ub450 \uac1c\uc758 \uac1d\uccb4\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uac00\uc7a5 \uc88b\uc740 \uc608\ub294 \uc544\ub2d0\uc9c0 \ubaa8\ub974\uc9c0\ub9cc \uc791\ub3d9\ud558\ub3c4\ub85d \ub9cc\ub4e4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ucf54\uc2a4 \ub370\uc774\ud130\ub294 \ucf54\uc2a4 \uc791\uc131\uc790\uc758 \uacc4\uc815\uc744 \ucc38\uc870\ud569\ub2c8\ub2e4. \uc791\uc131\uc790 \uc815\ubcf4\uc5d0 \ub300\ud55c \ub9ac\uc878\ubc84 \uba54\uc11c\ub4dc\ub97c \ub9cc\ub4e4 \uc608\uc815\uc774\uc9c0\ub9cc \uc544\uc9c1\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uba3c\uc800 \uacc4\uc815 \ub370\uc774\ud130\uc5d0 \ub300\ud55c \ucffc\ub9ac\ub97c \ubcc4\ub3c4\ub85c \uc0dd\uc131\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<pre class=\"lang:default decode:true\">const schema = new GraphQLSchema({\r\n    query: new GraphQLObjectType({\r\n        \uc774\ub984: '\ucffc\ub9ac',\r\n        fields: {\r\n            account: {\r\n                type: AccountType,\r\n                resolve: (root, args, context, info) =&gt; {\r\n                    \ubc18\ud658 \uc0c8 \ud504\ub85c\ubbf8\uc2a4((resolve, reject) =&gt; {\r\n                        if(!context.decodedToken) {\r\n                            return reject(\"\uc720\ud6a8\ud55c \uc778\uc99d \ud1a0\ud070\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.\");\r\n                        }\r\n                        var statement = \"SELECT META(account).id, account.username, account.`password` FROM `\" + bucket._name + \"` AS account WHERE account.type = 'account' AND META(account).id = $id\";\r\n                        var query = Couchbase.N1qlQuery.fromString(statement);\r\n                        bucket.query(query, { \"id\": context.decodedToken }, (error, result) =&gt; {\r\n                            if(error) {\r\n                                return reject(error.message);\r\n                            }\r\n                            resolve(result[0]);\r\n                        });\r\n                    });\r\n                }\r\n            }\r\n        }\r\n    })\r\n});<\/pre>\n<p>\ub2e4\uc74c\uacfc \uac19\uc740 \ucffc\ub9ac\uac00 \uc788\uc744 \ub54c\ub9cc \uc758\ubbf8\uac00 \uc788\uc2b5\ub2c8\ub2e4. <code>\uacc4\uc815<\/code>\ub97c \uc0ac\uc6a9\ud558\uc5ec \ud2b9\uc815 \uacc4\uc815\uc5d0 \ub300\ud55c \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\uace0\uc790 \ud558\ub294 \uacbd\uc6b0 \ud574\ub2f9 \uacc4\uc815\uc740 \uc790\uc2e0\uc758 \uacc4\uc815\uc774\uc5b4\uc57c \ud569\ub2c8\ub2e4. \uc790\uc2e0\uc758 \uacc4\uc815\uc744 \ucffc\ub9ac\ud558\ub294 \uacbd\uc6b0 \uc720\ud6a8\ud55c JWT\uac00 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc6b0\ub9ac\uac00 \uc5b4\ub5bb\uac8c \uc0ac\uc6a9\ud558\uace0 \uc788\ub294\uc9c0 \uc8fc\ubaa9\ud558\uc138\uc694. <code>context.decodeToken<\/code> \ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \uadf8\ub9ac\uace0 <code>\ucee8\ud14d\uc2a4\ud2b8<\/code> \ub97c \uc0ac\uc6a9\ud558\uba74 \uc694\uccad\uc5d0\uc11c \ub370\uc774\ud130\ub97c \uac00\uc838\uc62c \uc218 \uc788\uc73c\uba70, \uc774 \uacbd\uc6b0 \ub514\ucf54\ub529\ub41c \ud1a0\ud070 \ub370\uc774\ud130\uac00 \uc694\uccad\uc5d0 \uc874\uc7ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud1a0\ud070\uc774 \uc874\uc7ac\ud558\uc9c0 \uc54a\ub294\ub2e4\uba74 \uc720\ud6a8\ud55c \ud1a0\ud070\uc774 \uc774 \ucffc\ub9ac\uc758 \uc694\uad6c \uc0ac\ud56d\uc774\ubbc0\ub85c \uc624\ub958\ub97c \ubc1c\uc0dd\uc2dc\ucf1c\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc720\ud6a8\ud55c \ud1a0\ud070\uc774 \uc788\uc73c\uba74 N1QL \ucffc\ub9ac\ub97c \uc0dd\uc131\ud558\uace0 \uc0ac\uc6a9\uc790 ID\ub97c \uc0ac\uc6a9\ud558\uc5ec \uacc4\uc815\uc744 \ucffc\ub9ac\ud558\uace0 \ubc18\ud658\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ub098\uc058\uc9c0 \uc54a\uc8e0?<\/p>\n<p>\ucffc\ub9ac\ub97c \uc880 \ub354 \ud655\uc7a5\ud574 \ubcf4\uaca0\uc2b5\ub2c8\ub2e4. \ub0b4\uc5d0\uc11c <code>\ud544\ub4dc<\/code> \uac1d\uccb4\uc5d0 \ub610 \ub2e4\ub978 \ucffc\ub9ac\ub97c \ucd94\uac00\ud560 \uc608\uc815\uc774\uc9c0\ub9cc \uc774\ubc88\uc5d0\ub294 \ucf54\uc2a4 \ub370\uc774\ud130\ub97c \ucffc\ub9ac\ud558\uac8c \ub418\uba70 \ucf54\uc2a4 \ub370\uc774\ud130\uac00 \ubc18\ub4dc\uc2dc \ubcf4\ud638\ub418\uc9c0\ub294 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<pre class=\"lang:default decode:true\">\ucf54\uc2a4: {\r\n    type: \uadf8\ub798\ud504QL\ub9ac\uc2a4\ud2b8(\ucf54\uc2a4 \uc720\ud615),\r\n    resolve: (root, args, context, info) =&gt; {\r\n        \ubc18\ud658 \uc0c8 \uc57d\uc18d((resolve, reject) =&gt; {\r\n            var statement = \"SELECT META(course).id, course.title, course.length, course.author FROM `\" + bucket._name + \"` AS course WHERE course.type = 'course'\";\r\n            var query = Couchbase.N1qlQuery.fromString(statement);\r\n            bucket.query(query, (error, result) =&gt; {\r\n                if(error) {\r\n                    return reject(error.message);\r\n                }\r\n                resolve(result);\r\n            });\r\n        });\r\n    }\r\n}<\/pre>\n<p>\uc704\uc758 \ucf54\ub4dc\uc5d0\uc11c\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ub41c \ubaa8\ub4e0 \ucf54\uc2a4\uc5d0 \ub300\ud574 \uac04\ub2e8\ud55c N1QL \ucffc\ub9ac\ub97c \uc218\ud589\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \uc5ec\uae30\uc11c \ubb38\uc81c\ub294 \uc791\uc131\uc790 \ub370\uc774\ud130\uc758 \uacbd\uc6b0 \ubcf4\ud638\ub418\ub294 \uc804\uccb4 \ub85c\ub4dc\ub41c \uacc4\uc815 \ub370\uc774\ud130\uac00 \uc544\ub2c8\ub77c \ud0a4\ub9cc \uac00\uc838\uc628\ub2e4\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uc2e4\uc81c\ub85c GraphQL \uac1d\uccb4\uc5d0\uc11c \ub2e4\uc74c\uacfc \uac19\uc740 \uba87 \uac00\uc9c0 \ub370\uc774\ud130 \uc870\uc791\uc744 \uc218\ud589\ud558\uaca0\uc2b5\ub2c8\ub2e4. <code>\ucf54\uc2a4 \uc720\ud615<\/code> \ub300\uc2e0<\/p>\n<pre class=\"lang:default decode:true\">const CourseType = new GraphQLObjectType({\r\n    \uc774\ub984: \"\ucf54\uc2a4\",\r\n    fields: {\r\n        id: { type: GraphQLID },\r\n        title: { type: GraphQLString },\r\n        length: { type: GraphQLString },\r\n        author: {\r\n            type: AccountType,\r\n            resolve: (root, args, context, info) =&gt; {\r\n                \ubc18\ud658 \uc0c8 \ud504\ub85c\ubbf8\uc2a4((resolve, reject) =&gt; {\r\n                    if(!context.decodedToken || context.decodedToken != root.author) {\r\n                        return reject(\"\uc720\ud6a8\ud55c \uc778\uc99d \ud1a0\ud070\uc774 \ud544\uc694\ud569\ub2c8\ub2e4.\");\r\n                    }\r\n                    var statement = \"SELECT META(account).id, account.username, account.`password` FROM `\" + bucket._name + \"` AS account WHERE account.type = 'account' AND META(account).id = $id\";\r\n                    var query = Couchbase.N1qlQuery.fromString(statement);\r\n                    bucket.query(query, { \"id\": root.author }, (error, result) =&gt; {\r\n                        if(error) {\r\n                            return reject({ code: error.code, message: error.message });\r\n                        }\r\n                        resolve(result[0]);\r\n                    });\r\n                });\r\n            }\r\n        }\r\n    }\r\n});<\/pre>\n<p>\uc774\uc81c <code>\ud574\uacb0<\/code> \ud568\uc218\uc758 <code>\uc791\uc131\uc790<\/code> \uc18d\uc131\uc744 \ud638\ucd9c\ud569\ub2c8\ub2e4. \uc774 \ud568\uc218\uc5d0\uc11c\ub294 \uc720\ud6a8\ud55c \ud1a0\ud070\uc774 \uc788\ub294\uc9c0 \ud655\uc778\ud558\uace0 \ud1a0\ud070\uc744 \ucc3e\uc9c0 \ubabb\ud558\uba74 \uc624\ub958\ub97c \ubc18\ud658\ud569\ub2c8\ub2e4. \uc774 \uac80\uc0ac \ubc0f \uc624\ub958\ub294 <code>\uc791\uc131\uc790<\/code> \ub370\uc774\ud130\uac00 \uc694\uccad\ub429\ub2c8\ub2e4. \ucffc\ub9ac\uc5d0\uc11c \ub2e4\uc74c\uc744 \uc694\uccad\ud558\uc9c0 \uc54a\ub294 \uacbd\uc6b0 <code>\uc791\uc131\uc790<\/code> \ub370\uc774\ud130\ub294 \ubcf4\ud638\ub418\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \ud1a0\ud070 \uc5c6\uc774\ub3c4 \ub2e4\ub978 \uc815\ubcf4\ub97c \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc5ec\uae30\uc5d0\ub294 \ub610 \ub2e4\ub978 \ubb38\uc81c\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc720\ud6a8\ud55c JWT\uac00 \uc874\uc7ac\ud558\ub294\uc9c0 \ud655\uc778\ud558\ub294 \uac83\ubfd0\ub9cc \uc544\ub2c8\ub77c JWT\uac00 N1QL \ucffc\ub9ac\uc5d0\uc11c \ubc18\ud658\ub41c \ub370\uc774\ud130\uc640 \uc77c\uce58\ud558\ub294\uc9c0 \ud655\uc778\ud574\uc57c \ud569\ub2c8\ub2e4. \uc989, \uc791\uc131\uc790\uac00 \uc5ec\ub7ec \uba85\uc778 \uacbd\uc6b0 \uad8c\ud55c\uc774 \uc788\ub294 \uc791\uc131\uc790\ub9cc \uc131\uacf5\ud569\ub2c8\ub2e4. \ub2e4\uc2dc \ub9d0\ud558\uc9c0\ub9cc, \uac00\uc7a5 \uc88b\uc740 \uc608\ub294 \uc544\ub2c8\uc9c0\ub9cc \uc6b0\ub9ac\uc758 \uc694\uc810\uc744 \uc99d\uba85\ud569\ub2c8\ub2e4.<\/p>\n<p>\ubbf8\uc9c4\ud55c \ubd80\ubd84\uc744 \uc815\ub9ac\ud558\uae30 \uc704\ud574\uc11c\ub294 <code>\/graphql<\/code> \uc5d4\ub4dc\ud3ec\uc778\ud2b8:<\/p>\n<pre class=\"lang:default decode:true\">app.use(\"\/graphql\", ExpressGraphQL({\r\n    \uc2a4\ud0a4\ub9c8: \uc2a4\ud0a4\ub9c8,\r\n    graphiql: true\r\n}));<\/pre>\n<p>\uc6b0\ub9ac\uac00 \ud55c \uc77c\uc740 <code>\uc2a4\ud0a4\ub9c8<\/code> \uc5ec\uae30\uc5d0\ub294 \ub450 \uac00\uc9c0 \uac00\ub2a5\ud55c \ucffc\ub9ac\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4.<\/p>\n<h2>\uacb0\ub860<\/h2>\n<p>\uc608\uc81c\ub294 \uac04\ub2e8\ud588\uc9c0\ub9cc GraphQL\uc744 \uc0ac\uc6a9\ud558\uc5ec \ubcf4\ud638\ub41c \ucffc\ub9ac\uc640 \ub370\uc774\ud130 \uc870\uac01\uc744 \uc2dc\uc5f0\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4, <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/\" target=\"_blank\" rel=\"noopener noreferrer\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a>\ubc0f JSON \uc6f9 \ud1a0\ud070(JWT)\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\uc5b5\ud574\uc57c \ud560 \uba87 \uac00\uc9c0 \ud575\uc2ec \uc0ac\ud56d\uc785\ub2c8\ub2e4:<\/p>\n<ol>\n<li>GraphQL\uc5d0\uc11c \uc694\uccad \ub370\uc774\ud130\uc5d0 \uc561\uc138\uc2a4\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <code>\ucee8\ud14d\uc2a4\ud2b8<\/code> \ubcc0\uc218\uc785\ub2c8\ub2e4.<\/li>\n<li>JSON \uc6f9 \ud1a0\ud070\uacfc \uacc4\uc815\uc740 GraphQL \ubcc0\ud615\uc744 \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc544\ub2c8\ub77c \ubcc4\ub3c4\uc758 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \ud1b5\ud574 \ub9cc\ub4e4\uc5b4\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<li>JWT\ub85c \ub370\uc774\ud130 \uc18d\uc131\ubfd0\ub9cc \uc544\ub2c8\ub77c \ucffc\ub9ac\ub3c4 \uc81c\ud55c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774\uac83\uc740 \uc804\ubd80 \uc544\ub2c8\uba74 \uc804\ubb34\uc758 \uc77c\ub828\uc758 \uc774\ubca4\ud2b8\uac00 \uc544\ub2d9\ub2c8\ub2e4.<\/li>\n<\/ol>\n<p>GraphQL\uc5d0 \ub300\ud574 \ub354 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\uc2dc\ub824\uba74 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/creating-a-graphql-application-with-node-js-and-a-nosql-database\/\" target=\"_blank\" rel=\"noopener noreferrer\">\uc774\uc804 \ud29c\ud1a0\ub9ac\uc5bc<\/a> \ub97c \ucc38\uc870\ud558\uc138\uc694. Node.js\uac00 \ud3ec\ud568\ub41c Couchbase\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\ub824\uba74 \ub2e4\uc74c\uc744 \ud655\uc778\ud558\uc138\uc694. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/developers\/\" target=\"_blank\" rel=\"noopener noreferrer\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uac1c\ubc1c\uc790 \ud3ec\ud138<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>A few months ago when I had first started learning about GraphQL, I had written a previous tutorial for using it with Couchbase and Node.js. The tutorial focused on the basics which included creating GraphQL objects and querying those objects [&hellip;]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1814,1815,1816,1822,1813,1812],"tags":[1393,1261,2251],"ppma_author":[9032],"class_list":["post-5359","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-node-js","category-security","category-n1ql-query","tag-api","tag-json","tag-jwt"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JWT Authentication with GraphQL, Node.js &amp; Couchbase NoSQL<\/title>\n<meta name=\"description\" content=\"Learn to protect specific data elements of your GraphQL powered API that uses the NoSQL database, Couchbase Server, and Node.js using JSON Web Tokens (JWT).\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/ko\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JWT Authentication with GraphQL, Node.js &amp; Couchbase NoSQL\" \/>\n<meta property=\"og:description\" content=\"Learn to protect specific data elements of your GraphQL powered API that uses the NoSQL database, Couchbase Server, and Node.js using JSON Web Tokens (JWT).\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/ko\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2018-06-28T14:00:12+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T01:32:52+00:00\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"JWT Authentication with GraphQL, Node.js &amp; Couchbase NoSQL\",\"datePublished\":\"2018-06-28T14:00:12+00:00\",\"dateModified\":\"2025-06-14T01:32:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/\"},\"wordCount\":1696,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"API\",\"JSON\",\"jwt\"],\"articleSection\":[\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"Node.js\",\"Security\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/\",\"name\":\"JWT Authentication with GraphQL, Node.js &amp; Couchbase NoSQL\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2018-06-28T14:00:12+00:00\",\"dateModified\":\"2025-06-14T01:32:52+00:00\",\"description\":\"Learn to protect specific data elements of your GraphQL powered API that uses the NoSQL database, Couchbase Server, and Node.js using JSON Web Tokens (JWT).\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JWT Authentication with GraphQL, Node.js &amp; Couchbase NoSQL\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/ko\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"GraphQL, Node.js \ubc0f Couchbase NoSQL\uc744 \uc0ac\uc6a9\ud55c JWT \uc778\uc99d","description":"Learn to protect specific data elements of your GraphQL powered API that uses the NoSQL database, Couchbase Server, and Node.js using JSON Web Tokens (JWT).","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/ko\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/","og_locale":"ko_KR","og_type":"article","og_title":"JWT Authentication with GraphQL, Node.js &amp; Couchbase NoSQL","og_description":"Learn to protect specific data elements of your GraphQL powered API that uses the NoSQL database, Couchbase Server, and Node.js using JSON Web Tokens (JWT).","og_url":"https:\/\/www.couchbase.com\/blog\/ko\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2018-06-28T14:00:12+00:00","article_modified_time":"2025-06-14T01:32:52+00:00","author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"8\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"JWT Authentication with GraphQL, Node.js &amp; Couchbase NoSQL","datePublished":"2018-06-28T14:00:12+00:00","dateModified":"2025-06-14T01:32:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/"},"wordCount":1696,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["API","JSON","jwt"],"articleSection":["Application Design","Best Practices and Tutorials","Couchbase Server","Node.js","Security","SQL++ \/ N1QL Query"],"inLanguage":"ko-KR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/","url":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/","name":"GraphQL, Node.js \ubc0f Couchbase NoSQL\uc744 \uc0ac\uc6a9\ud55c JWT \uc778\uc99d","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2018-06-28T14:00:12+00:00","dateModified":"2025-06-14T01:32:52+00:00","description":"Learn to protect specific data elements of your GraphQL powered API that uses the NoSQL database, Couchbase Server, and Node.js using JSON Web Tokens (JWT).","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/jwt-authentication-with-graphql-node-js-and-couchbase-nosql\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JWT Authentication with GraphQL, Node.js &amp; Couchbase NoSQL"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, \uac1c\ubc1c\uc790 \uc639\ud638\uc790, Couchbase","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"\ub2c9 \ub77c\ubcf4\uc774\ub294 \ucd5c\uc2e0 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc744 \uc639\ud638\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4. \uadf8\ub294 Java, JavaScript, Golang \ubc0f Angular, NativeScript, Apache Cordova\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub300\ud55c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. Nic\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ubcf4\ub2e4 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\uace0 \uc788\uc2b5\ub2c8\ub2e4.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/ko\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","first_name":"Nic","last_name":"Raboy","user_url":"https:\/\/www.thepolyglotdeveloper.com","author_category":"","description":"\ub2c9 \ub77c\ubcf4\uc774\ub294 \ucd5c\uc2e0 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c \uae30\uc220\uc744 \uc639\ud638\ud558\ub294 \uc0ac\ub78c\uc785\ub2c8\ub2e4. \uadf8\ub294 Java, JavaScript, Golang \ubc0f Angular, NativeScript, Apache Cordova\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ud504\ub808\uc784\uc6cc\ud06c\uc5d0 \ub300\ud55c \uacbd\ud5d8\uc774 \uc788\uc2b5\ub2c8\ub2e4. Nic\uc740 \uc6f9 \ubc0f \ubaa8\ubc14\uc77c \uac1c\ubc1c\uc744 \ubcf4\ub2e4 \uc27d\uac8c \uc774\ud574\ud560 \uc218 \uc788\ub3c4\ub85d \uc790\uc2e0\uc758 \uac1c\ubc1c \uacbd\ud5d8\uc5d0 \ub300\ud574 \uae00\uc744 \uc4f0\uace0 \uc788\uc2b5\ub2c8\ub2e4."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/5359","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=5359"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/5359\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=5359"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=5359"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=5359"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=5359"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}