{"id":31279,"date":"2019-05-27T21:26:49","date_gmt":"2019-05-27T12:26:49","guid":{"rendered":"https:\/\/jirak.net\/wp\/amazon-cognito-%ea%b8%b0%eb%b0%98-%ec%95%94%ed%98%b8%ea%b0%80-%eb%b6%88%ed%95%84%ec%9a%94%ed%95%9c-%ec%84%9c%eb%b2%84%eb%a6%ac%ec%8a%a4-%ec%9d%b4%eb%a9%94%ec%9d%bc-%ec%9d%b8%ec%a6%9d-%ea%b5%ac\/"},"modified":"2019-05-27T21:34:26","modified_gmt":"2019-05-27T12:34:26","slug":"amazon-cognito-%ea%b8%b0%eb%b0%98-%ec%95%94%ed%98%b8%ea%b0%80-%eb%b6%88%ed%95%84%ec%9a%94%ed%95%9c-%ec%84%9c%eb%b2%84%eb%a6%ac%ec%8a%a4-%ec%9d%b4%eb%a9%94%ec%9d%bc-%ec%9d%b8%ec%a6%9d-%ea%b5%ac","status":"publish","type":"post","link":"https:\/\/jirak.net\/wp\/amazon-cognito-%ea%b8%b0%eb%b0%98-%ec%95%94%ed%98%b8%ea%b0%80-%eb%b6%88%ed%95%84%ec%9a%94%ed%95%9c-%ec%84%9c%eb%b2%84%eb%a6%ac%ec%8a%a4-%ec%9d%b4%eb%a9%94%ec%9d%bc-%ec%9d%b8%ec%a6%9d-%ea%b5%ac\/","title":{"rendered":"Amazon Cognito \uae30\ubc18 \uc554\ud638\uac00 \ubd88\ud544\uc694\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc774\uba54\uc77c \uc778\uc99d \uad6c\ud604 \ubc29\ubc95"},"content":{"rendered":"<p>Amazon Cognito \uae30\ubc18 \uc554\ud638\uac00 \ubd88\ud544\uc694\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc774\uba54\uc77c \uc778\uc99d \uad6c\ud604 \ubc29\ubc95<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/jirak.net\/wp\/wp-content\/uploads\/2019\/05\/diagram.png\" width=\"1062\" height=\"581\"><\/p>\n<p>\ub300\uccb4\ub85c \uc6f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \uc554\ud638\ub97c \uae30\uc5b5\ud558\uace0 \uc788\uae30\ub780 \uc27d\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 \uc790\uc8fc \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc554\ud638\ub77c\uba74 \ub354\uc6b1 \uadf8\ub807\uc9c0\uc694. \ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ucc98\ub7fc, \uc5ec\ub7ec\ubd84\ub3c4 \uc6f9 \uc0ac\uc774\ud2b8\uc640 \uc571\uc5d0\uc11c \u201c\uc554\ud638\ub97c \uc78a\uc5b4\ubc84\ub9ac\uc168\uc2b5\ub2c8\uae4c?\u201d \ub9c1\ud06c\ub098 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\ub294 \uc77c\uc774 \uaf64 \uc775\uc219\ud560\uc9c0\ub3c4 \ubaa8\ub985\ub2c8\ub2e4.<\/p>\n<p>\uadf8\ub798\uc11c \ub9ce\uc740 \uc0ac\ub78c\uc774 \uc9e7\uc740 \uc554\ud638\ub97c \uc0ac\uc6a9\ud558\uac70\ub098 \ub5a0\uc62c\ub9ac\uae30 \uc26c\uc6b4 \uc554\ud638\ub97c \uc0ac\uc6a9\ud558\uac70\ub098 \uc5ec\ub7ec \uc0ac\uc774\ud2b8\uc640 \uc571\uc5d0\uc11c \uac19\uc740 \uc554\ud638\ub97c \uc7ac\uc0ac\uc6a9\ud558\ub294 \ub4f1 \uc798\ubabb\ub41c \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\ud5a5\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc554\ud638 \uad00\ub9ac\uc790\ucc98\ub7fc, \uc774\ub97c \uc704\ud55c \uc194\ub8e8\uc158\ub3c4 \uc788\uc9c0\ub9cc, \uc2e4\uc81c\ub85c \uc554\ud638\uc5d0 \uae30\ubc18\ud55c \ubcf4\uc548\uc740 \uc548\uc804\ud558\uc9c0 \uc54a\uc73c\uba70, \ud2b9\ud788 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uce5c\uc219\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc9c0\ubb38\uc774\ub098 \uc5bc\uad74 \uc778\uc2dd\uc744 \uc0ac\uc6a9\ud558\ub294 \ub4f1 \uc554\ud638 \ub85c\uadf8\uc778\uc744 \ub300\uccb4\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uae34 \ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ud56d\uc0c1 \uc774\ub7ec\ud55c \ubc29\ubc95\uc774 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4.<\/p>\n<p>\uc190\uc27d\uac8c \uc778\uc99d \uc11c\ube44\uc2a4\ub97c \uad6c\ud604\ud558\uac8c \ud574 \uc8fc\ub294 <a href=\"https:\/\/aws.amazon.com\/ko\/cognito\">Amazon Cognito<\/a>\uc5d0\uc11c\ub294 \ub300\uc548\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ub85c\uadf8\uc778\ud560 \ub54c \uc608\ub97c \ub4e4\uc5b4, \uc774\uba54\uc77c, SMS \ub610\ub294 \ud478\uc2dc \uc54c\ub9bc\uc744 \ud1b5\ud574 \uc6f9 \uc0ac\uc774\ud2b8\ub098 \uc571\uc5d0\uc11c \uc784\uc2dc \uc77c\ud68c\uc131 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uc0ac\uc6a9\uc790\uc5d0\uac8c \ubcf4\ub0b4\uae30\ub9cc \ud558\uace0, \uc554\ud638\ub97c \uc785\ub825\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4\uba74 \uc5b4\ub5a8\uae4c\uc694? \uadf8\ub0e5 \ucf54\ub4dc\ub97c \ubc1b\uc544\uc11c \uc785\ub825\ud558\uace0 \ub85c\uadf8\uc778\ud558\uba74 \ub429\ub2c8\ub2e4. \u201c\uc554\ud638\ub97c \uc78a\uc5b4\ubc84\ub9ac\uc168\uc2b5\ub2c8\uae4c\u201d \ud504\ub85c\uc138\uc2a4\uc640 \ube44\uc2b7\ud558\uc9c0\ub9cc, \ub354 \uac04\ub2e8\ud558\uace0 \uc9e7\uc2b5\ub2c8\ub2e4. \ub610\ud55c \uc554\ud638\ub97c <em>\uc78a\uc744\uae4c<\/em> \uac71\uc815\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub429\ub2c8\ub2e4.<\/p>\n<p><a href=\"https:\/\/docs.aws.amazon.com\/cognito\/latest\/developerguide\/cognito-user-identity-pools.html\">Amazon Cognito \uc0ac\uc6a9\uc790 \ud480<\/a>\uc744 \uc0ac\uc6a9\ud558\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \uc0dd\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \ube14\ub85c\uadf8 \uac8c\uc2dc\ubb3c\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790 \uc774\uba54\uc77c \uc8fc\uc18c\ub85c \uc77c\ud68c\uc131 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uc804\uc1a1\ud558\ub294 \uc554\ud638 \uc5c6\ub294 \uc778\uc99d \ud50c\ub85c\uc6b0\uc758 \uc0d8\ud50c\uc744 \uad6c\ud604\ud558\uc5ec \uc774\ub97c \uc218\ud589\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/p>\n<h2>\uc194\ub8e8\uc158 \uac1c\uc694<\/h2>\n<p>\uc554\ud638 \uc5c6\ub294 \uc774\uba54\uc77c \uc778\uc99d \uc194\ub8e8\uc158\uc5d0\uc11c\ub294 Amazon Cognito \uc0ac\uc6a9\uc790 \ud480\uacfc \ud55c\ub450 \uac00\uc9c0 Lambda \ud568\uc218\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc774\ub97c \ud568\uaed8 \uc0ac\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \uad6c\ud604\ud569\ub2c8\ub2e4. \uc77c\ud68c\uc131 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \ud3ec\ud568\ud558\ub294 \uc774\uba54\uc77c\uc744 \uc804\uc1a1\ud558\uae30 \uc704\ud574\uc11c\ub294 <a href=\"https:\/\/aws.amazon.com\/ses\/\">Amazon Simple Email Service<\/a>(Amazon SES)\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \ub610\ud55c \ub85c\uadf8\uc778 \ud504\ub85c\uc138\uc2a4\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 UI \ud398\uc774\uc9c0(HTML \ubc0f JavaScript)\ub85c \uc9c0\uc6d0\ub429\ub2c8\ub2e4.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-2148\" src=\"https:\/\/d2908q01vomqb2.cloudfront.net\/0a57cb53ba59c46fc4b692527a38a87c78d84028\/2018\/12\/31\/diagram.png\" alt=\"\uc194\ub8e8\uc158 \uac1c\uc694 - \ub2e4\uc774\uc5b4\uadf8\ub7a8\" width=\"800\" height=\"438\" \/><\/p>\n<p>\uc774 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uacfc \ub2e4\uc74c \ub2e8\uacc4\uc5d0\uc11c \uc194\ub8e8\uc158\uc758 \ud504\ub85c\uc138\uc2a4\ub97c \uc124\uba85\ud569\ub2c8\ub2e4.<\/p>\n<ol>\n<li>\uc0ac\uc6a9\uc790\uac00 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub85c\uadf8\uc778 \ud398\uc774\uc9c0\uc5d0 \uc774\uba54\uc77c \uc8fc\uc18c\ub97c \uc785\ub825\ud569\ub2c8\ub2e4. \uadf8\ub7ec\uba74 \uc774 \uc8fc\uc18c\ub97c Amazon Cognito \uc0ac\uc6a9\uc790 \ud480\ub85c \uc804\uc1a1\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0ac\uc6a9\uc790 \ud480\uc5d0\uc11c \u201c\uc778\uc99d \ubb38\uc81c \uc815\uc758\u201d Lambda \ud568\uc218\ub97c \ud638\ucd9c\ud569\ub2c8\ub2e4. \uc774 Lambda \ud568\uc218\ub294 \uc0dd\uc131\ud574\uc57c \ud558\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ubb38\uc81c\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0ac\uc6a9\uc790 \ud480\uc5d0\uc11c \u201c\uc778\uc99d \ubb38\uc81c \uc0dd\uc131\u201d Lambda \ud568\uc218\ub97c \ud638\ucd9c\ud569\ub2c8\ub2e4. \uc774 Lambda \ud568\uc218\ub294 \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\uace0 Amazon SES\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc0ac\uc6a9\uc790\uc5d0\uac8c \uba54\uc77c\ub85c \uc804\uc1a1\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0ac\uc6a9\uc790\uac00 \uba54\uc77c\ubc15\uc2a4\uc5d0\uc11c \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uac80\uc0c9\ud558\uace0 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub85c\uadf8\uc778 \ud398\uc774\uc9c0\uc5d0 \uc774 \ucf54\ub4dc\ub97c \uc785\ub825\ud569\ub2c8\ub2e4. \uadf8\ub7ec\uba74 \uc774 \ud398\uc774\uc9c0\uc5d0\uc11c \ud574\ub2f9 \ucf54\ub4dc\ub97c \uc0ac\uc6a9\uc790 \ud480\ub85c \uc804\uc1a1\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0ac\uc6a9\uc790 \ud480\uc5d0\uc11c \u201c\uc778\uc99d \ubb38\uc81c \uc751\ub2f5 \ud655\uc778\u201d Lambda \ud568\uc218\ub97c \ud638\ucd9c\ud569\ub2c8\ub2e4. \uc774 Lambda \ud568\uc218\ub294 \uc0ac\uc6a9\uc790\uac00 \uc785\ub825\ud55c \ucf54\ub4dc\ub97c \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0ac\uc6a9\uc790 \ud480\uc5d0\uc11c \u201c\uc778\uc99d \ubb38\uc81c \uc815\uc758\u201d Lambda \ud568\uc218\ub97c \ud638\ucd9c\ud569\ub2c8\ub2e4. \uc774 Lambda \ud568\uc218\ub294 \uc778\uc99d \ubb38\uc81c\uc5d0 \uc131\uacf5\uc801\uc73c\ub85c \uc751\ub2f5\ub418\uc5c8\ub294\uc9c0, \ucd94\uac00 \uc778\uc99d \ubb38\uc81c\ub294 \ud544\uc694\ud558\uc9c0 \uc54a\uc740\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \ud480\uc5d0 \ub300\ud55c \uc751\ub2f5\uc5d0 \u201cissueTokens: true\u201d\uac00 \ud3ec\ud568\ub429\ub2c8\ub2e4. \uc774\uc81c \uc0ac\uc6a9\uc790 \ud480\uc740 \uc0ac\uc6a9\uc790\uac00 \uc778\uc99d\ub418\uc5c8\ub2e4\uace0 \uac04\uc8fc\ud558\uace0, \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc62c\ubc14\ub978 JWT(JSON \uc6f9 \ud1a0\ud070)\uc744 \ubcf4\ub0c5\ub2c8\ub2e4(\uc751\ub2f5\uc5d0\uc11c\ub294 4).<\/li>\n<\/ol>\n<h2>\uc11c\ubc84\ub9ac\uc2a4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158<\/h2>\n<p>\uc0d8\ud50c \uad6c\ud604\uc740 \uc11c\ubc84\ub9ac\uc2a4 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc73c\ub85c \ud328\ud0a4\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/serverlessrepo.aws.amazon.com\/applications\/arn:aws:serverlessrepo:us-east-1:520945424137:applications~amazon-cognito-passwordless-email-auth\">AWS Serverless Application Repository<\/a>\uc5d0\uc11c \ubc30\ud3ec\ud558\uace0 \uc791\ub3d9 \ubc29\uc2dd\uc744 \ud655\uc778\ud558\uc138\uc694.<\/p>\n<p>\uc0ac\uc6a9\uc790 \ud480 \uad6c\uc131\uc5d0\uc11c \uad00\ub828\ub41c \ubd80\ubd84\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc0ac\uc6a9\uc790 \uc774\ub984\uc73c\ub85c \uc774\uba54\uc77c \uc8fc\uc18c\uac00 \ud544\uc694\ud569\ub2c8\ub2e4.<\/li>\n<li>\u201c\uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d\ub9cc \ud5c8\uc6a9\u201d\uc73c\ub85c \uad6c\uc131\ub41c \uc571 \ud074\ub77c\uc774\uc5b8\ud2b8\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uac00 \uac00\uc785\ud560 \ub54c Amazon Cognito\uc5d0 \uc554\ud638\uac00 \ud544\uc694\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \uc774\uc5d0 \ub300\ud574 \uc800\ud76c\ub294 \uc784\uc758 \ubb38\uc790\uc5f4\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc2e4\uc81c\ub85c \uc0ac\uc6a9\uc790\uac00 \ub098\uc911\uc5d0 \uc774 \uc554\ud638\ub85c \ub85c\uadf8\uc778\ud558\ub294 \uc77c\uc774 \uc5c6\ub3c4\ub85d \ud558\uae30 \uc704\ud574\uc11c\uc785\ub2c8\ub2e4.<\/li>\n<li>\uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \uad6c\ud604\ud558\ub294 \ub2e4\uc74c Lambda \ud568\uc218(Node.js 8.10)\uac00 \uad6c\uc131\ub429\ub2c8\ub2e4.\n<ul>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/cognito\/latest\/developerguide\/user-pool-lambda-define-auth-challenge.html\">\uc778\uc99d \ubb38\uc81c \uc815\uc758<\/a> \u2013 \uc774 Lambda \ud568\uc218\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \ucd94\uc801\ud569\ub2c8\ub2e4. \uc774\ub294 \uc0c1\ud0dc \uc2dc\uc2a4\ud15c\uc758 \uacb0\uc815\uc790 \ud568\uc218\uc640 \ube44\uc2b7\ud569\ub2c8\ub2e4. \uc774 \ud568\uc218\ub294 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc5b4\ub5a4 \uc21c\uc11c\ub85c \uc5b4\ub5a4 \uc778\uc99d \ubb38\uc81c\ub97c \ud45c\uc2dc\ud558\ub294\uc9c0 \uacb0\uc815\ud569\ub2c8\ub2e4. \ub9c8\uc9c0\ub9c9\uc5d0 \uc0ac\uc6a9\uc790\uac00 \uc778\uc99d\uc5d0 \uc131\uacf5\ud558\uac70\ub098 \uc2e4\ud328\ud55c \uacbd\uc6b0 \uc0ac\uc6a9\uc790 \ud480\uc5d0 \ub2e4\uc2dc \ubcf4\uace0\ud569\ub2c8\ub2e4. \uc774 Lambda \ud568\uc218\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\uac00 \uc2dc\uc791\ub420 \ub54c, \uadf8\ub9ac\uace0 \u201c\uc778\uc99d \ubb38\uc81c \uc751\ub2f5 \ud655\uc778\u201d \ud2b8\ub9ac\uac70\uac00 \ub04c\ub0a0 \ub54c\ub9c8\ub2e4 \ud638\ucd9c\ub429\ub2c8\ub2e4.<\/li>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/cognito\/latest\/developerguide\/user-pool-lambda-create-auth-challenge.html\">\uc778\uc99d \ubb38\uc81c \uc0dd\uc131<\/a> \u2013 \uc774 Lambda \ud568\uc218\ub294 \uc0ac\uc6a9\uc790\uc5d0 \ub300\ud574 \uace0\uc720\ud55c \uc778\uc99d \ubb38\uc81c\ub97c \uc0dd\uc131\ud558\uae30 \uc704\ud574 \u201c\uc778\uc99d \ubb38\uc81c \uc815\uc758\u201d \ud2b8\ub9ac\uac70\uc5d0 \uae30\ubc18\ud558\uc5ec \ud638\ucd9c\ub429\ub2c8\ub2e4. \uc774\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc77c\ud68c\uc131 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\uace0 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uba54\uc77c\ub85c \uc804\uc1a1\ud569\ub2c8\ub2e4.<\/li>\n<li><a href=\"https:\/\/docs.aws.amazon.com\/cognito\/latest\/developerguide\/user-pool-lambda-verify-auth-challenge-response.html\">\uc778\uc99d \ubb38\uc81c \uc751\ub2f5 \ud655\uc778<\/a> \u2013 \uc774 Lambda \ud568\uc218\ub294 \uc0ac\uc6a9\uc790\uac00 \uc778\uc99d \ubb38\uc81c\uc5d0 \ub300\ud55c \ub2f5\ubcc0\uc744 \uc81c\uacf5\ud560 \ub54c \uc0ac\uc6a9\uc790 \ud480\uc5d0\uc11c \ud638\ucd9c\ub429\ub2c8\ub2e4. \uc5ec\uae30\uc11c\ub294 \uc751\ub2f5\uc774 \uc62c\ubc14\ub978\uc9c0\ub9cc \ud655\uc778\ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\uc0ac\uc6a9\uc790\ub294 \uc9c1\uc811 \ubcf8\uc778\uc744 \uac00\uc785\uc2dc\ud0ac \uc218 \uc788\uc73c\uba70, <a href=\"https:\/\/docs.aws.amazon.com\/cognito\/latest\/developerguide\/user-pool-lambda-pre-sign-up.html\">\uc0ac\uc804 \uac00\uc785<\/a> \uc0ac\uc6a9\uc790 \ud480 \ud2b8\ub9ac\uac70\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc790\ub3d9 \ud655\uc778\ub429\ub2c8\ub2e4. \ub85c\uadf8\uc778 \uae30\ub2a5\uc758 \ud575\uc2ec\uc740 \uc774\uba54\uc77c \uc8fc\uc18c\uc774\uae30 \ub54c\ubb38\uc5d0, \uc0ac\uc6a9\uc790\uac00 \ubcc4\ub3c4\ub85c \uc790\uc2e0\uc758 \uc774\uba54\uc77c \uc8fc\uc18c\ub97c \ud655\uc778\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub429\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h3>\uc778\uc99d \ubb38\uc81c \uc0dd\uc131 \ud2b8\ub9ac\uac70<\/h3>\n<p>\ucf54\ub4dc\ub97c \uac80\ud1a0\ud558\uba74, \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uc0dd\uc131\ud558\uace0 \uc774\ub97c \uc0ac\uc6a9\uc790\uc5d0\uac8c \uba54\uc77c\ub85c \uc804\uc1a1\ud558\ub294 \uacfc\uc815\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uc5d0\uac8c\ub294 \uc62c\ubc14\ub978 \ucf54\ub4dc\ub97c \uc785\ub825\ud558\ub294 3\ubc88\uc758 \uae30\ud68c\uac00 \uc8fc\uc5b4\uc9c0\uba70, \ubaa8\ub450 \uc2e4\ud328\ud558\uba74 \uc0c8 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \ubc1b\uc544\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-js\">import { CognitoUserPoolTriggerHandler } from 'aws-lambda';\nimport { randomDigits } from 'crypto-secure-random-digit';\nimport { SES } from 'aws-sdk';\n\nconst ses = new SES();\n\nexport const handler: CognitoUserPoolTriggerHandler = async event =&gt; {\n\n    let secretLoginCode: string;\n    if (!event.request.session || !event.request.session.length) {\n\n        \/\/ This is a new auth session\n        \/\/ Generate a new secret login code and mail it to the user\n        secretLoginCode = randomDigits(6).join('');\n        await sendEmail(event.request.userAttributes.email, secretLoginCode);\n\n    } else {\n\n        \/\/ There's an existing session. Don't generate new digits but\n        \/\/ re-use the code from the current session. This allows the user to\n        \/\/ make a mistake when keying in the code and to then retry, rather\n        \/\/ the needing to e-mail the user an all new code again.    \n        const previousChallenge = event.request.session.slice(-1)[0];\n        secretLoginCode = previousChallenge.challengeMetadata!.match(\/CODE-(d*)\/)![1];\n    }\n\n    \/\/ This is sent back to the client app\n    event.response.publicChallengeParameters = {\n        email: event.request.userAttributes.email\n    };\n\n    \/\/ Add the secret login code to the private challenge parameters\n    \/\/ so it can be verified by the &quot;Verify Auth Challenge Response&quot; trigger\n    event.response.privateChallengeParameters = { secretLoginCode };\n\n    \/\/ Add the secret login code to the session so it is available\n    \/\/ in a next invocation of the &quot;Create Auth Challenge&quot; trigger\n    event.response.challengeMetadata = `CODE-${secretLoginCode}`;\n\n    return event;\n};\n\nasync function sendEmail(emailAddress: string, secretLoginCode: string) {\n    const params: SES.SendEmailRequest = {\n        Destination: { ToAddresses: [emailAddress] },\n        Message: {\n            Body: {\n                Html: {\n                    Charset: 'UTF-8',\n                    Data: `&lt;html&gt;&lt;body&gt;&lt;p&gt;This is your secret login code:&lt;\/p&gt;\n                           &lt;h3&gt;${secretLoginCode}&lt;\/h3&gt;&lt;\/body&gt;&lt;\/html&gt;`\n                },\n                Text: {\n                    Charset: 'UTF-8',\n                    Data: `Your secret login code: ${secretLoginCode}`\n                }\n            },\n            Subject: {\n                Charset: 'UTF-8',\n                Data: 'Your secret login code'\n            }\n        },\n        Source: process.env.SES_FROM_ADDRESS!\n    };\n    await ses.sendEmail(params).promise();\n}<\/code><\/pre>\n<\/div>\n<h3>\uc778\uc99d \ubb38\uc81c \ud655\uc778 \ud2b8\ub9ac\uac70<\/h3>\n<p>\uc774 \ud568\uc218\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790 \uc751\ub2f5\uc774 secretLoginCode\uc640 \uc77c\uce58\ud558\ub294\uc9c0\ub9cc \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-js\">import { CognitoUserPoolTriggerHandler } from 'aws-lambda';\n\nexport const handler: CognitoUserPoolTriggerHandler = async event =&gt; {\n    const expectedAnswer = event.request.privateChallengeParameters!.secretLoginCode; \n    if (event.request.challengeAnswer === expectedAnswer) {\n        event.response.answerCorrect = true;\n    } else {\n        event.response.answerCorrect = false;\n    }\n    return event;\n};<\/code><\/pre>\n<\/div>\n<h3>\uc778\uc99d \ubb38\uc81c \uc815\uc758 \ud2b8\ub9ac\uac70<\/h3>\n<p>\uc774 \ud568\uc218\ub294 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \uad00\ub9ac\ud558\ub294 \uacb0\uc815\uc790 \ud568\uc218\uc785\ub2c8\ub2e4. \uc774 Lambda \ud568\uc218\uc5d0 \uc81c\uacf5\ub41c \uc138\uc158 \ubc30\uc5f4(event.request.session)\uc5d0\ub294 \uc778\uc99d \ud50c\ub85c\uc6b0\uc758 \uc804\uccb4 \uc0c1\ud0dc\uac00 \ub098\uc640 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ube48 \uacbd\uc6b0 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\uac00 \ub9c9 \uc2dc\uc791\ub41c \uac83\uc785\ub2c8\ub2e4. \ud56d\ubaa9\uc774 \uc788\uc73c\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\uac00 \uc9c4\ud589 \uc911\uc784\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc778\uc99d \ubb38\uc81c\uac00 \uc81c\uc2dc\ub418\uace0, \uc0ac\uc6a9\uc790\uac00 \ub2f5\ubcc0\uc744 \uc81c\uacf5\ud558\uba70, \ub2f5\ubcc0\uc774 \uc62c\ubc14\ub978\uc9c0, \uc798\ubabb\ub418\uc5c8\ub294\uc9c0 \ud655\uc778\ud569\ub2c8\ub2e4. \uc5b4\ub290 \uacbd\uc6b0\ub4e0, \uacb0\uc815\uc790 \ud568\uc218\ub294 \ub2e4\uc74c\uc5d0 \uc218\ud589\ud560 \uc791\uc5c5\uc744 \uacb0\uc815\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-js\">import { CognitoUserPoolTriggerHandler } from 'aws-lambda';\n\nexport const handler: CognitoUserPoolTriggerHandler = async event =&gt; {\n    if (event.request.session &amp;&amp;\n        event.request.session.length &gt;= 3 &amp;&amp;\n        event.request.session.slice(-1)[0].challengeResult === false) {\n        \/\/ The user provided a wrong answer 3 times; fail auth\n        event.response.issueTokens = false;\n        event.response.failAuthentication = true;\n    } else if (event.request.session &amp;&amp;\n        event.request.session.length &amp;&amp;\n        event.request.session.slice(-1)[0].challengeResult === true) {\n        \/\/ The user provided the right answer; succeed auth\n        event.response.issueTokens = true;\n        event.response.failAuthentication = false;\n    } else {\n        \/\/ The user did not provide a correct answer yet; present challenge\n        event.response.issueTokens = false;\n        event.response.failAuthentication = false;\n        event.response.challengeName = 'CUSTOM_CHALLENGE';\n    }\n\n    return event;\n};<\/code><\/pre>\n<\/div>\n<h3>\uc0ac\uc804 \uac00\uc785 \ud2b8\ub9ac\uac70<\/h3>\n<p>\uc774 \ud568\uc218\ub294 \uac00\uc785 \uc911 \uc0ac\uc6a9\uc790\uc640 \uc774\uba54\uc77c \uc8fc\uc18c\ub97c \uc790\ub3d9 \ud655\uc778\ud569\ub2c8\ub2e4.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-js\">import { CognitoUserPoolTriggerHandler } from 'aws-lambda';\n\nexport const handler: CognitoUserPoolTriggerHandler = async event =&gt; {\n    event.response.autoConfirmUser = true;\n    event.response.autoVerifyEmail = true;\n    return event;\n};\n<\/code><\/pre>\n<\/div>\n<h2>\uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub85c\uadf8\uc778 \ud398\uc774\uc9c0 \uad6c\ud604<\/h2>\n<p>\uc0ac\uc6a9\uc790 \ud480\uc758 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \uc870\uc815\ud558\ub824\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub85c\uadf8\uc778 \ud398\uc774\uc9c0\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. <a href=\"https:\/\/aws-amplify.github.io\/docs\/js\/authentication\">AWS Amplify \ud504\ub808\uc784\uc6cc\ud06c<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec Amazon Cognito\uc640 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub85c\uadf8\uc778 \ud398\uc774\uc9c0\ub97c \ud1b5\ud569\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc790\uc8fc \uc0ac\uc6a9\ud558\ub294 \ud504\ub808\uc784\uc6cc\ud06c(React, Angular, Vue, plain HTML\/JavaScript \ub4f1)\uc5d0\uc11c \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ub85c\uadf8\uc778 \ud398\uc774\uc9c0\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \uc0d8\ud50c \uc194\ub8e8\uc158\uc758 \uba87 \uac00\uc9c0 JavaScript(TypeScript) \uc608\uc81c\uc785\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc5d0\uc11c\ub294 JavaScript\ub85c AWS Amplify \ud504\ub808\uc784\uc6cc\ud06c\ub97c \uc2dc\uc791\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-js\">import Amplify from 'aws-amplify';\n\nAmplify.configure({\n  Auth: {\n    region: 'your region',\n    userPoolId: 'your userPoolId',\n    userPoolWebClientId: 'your clientId',\n  }\n});<\/code><\/pre>\n<\/div>\n<h3>\uac00\uc785<\/h3>\n<p>\uc0ac\uc6a9\uc790\uac00 \ubcf8\uc778\uc744 \uc9c1\uc811 \uac00\uc785\uc2dc\ud0ac \uc218 \uc788\uc73c\ub824\uba74 AWS\uc5d0\uc11c \uc0ac\uc6a9\uc790\uc758 \uc554\ud638\ub97c \u201c\uc0dd\uc131\u201d\ud574\uc57c \ud569\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uac00 \uac00\uc785\ud560 \ub54c Amazon Cognito\uc5d0\uc11c \uc554\ud638\ub97c \uc694\uad6c\ud558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-js\">import { Auth } from 'aws-amplify';\nexport async function signUp(email: string, fullName: string) {\n  const params = {\n    username: email,\n    password: getRandomString(30),\n    attributes: {\n      name: fullName\n    }\n  };\n  await Auth.signUp(params);\n}\n\nfunction getRandomString(bytes: number) {\n  const randomValues = new Uint8Array(bytes);\n  window.crypto.getRandomValues(randomValues);\n  return Array.from(randomValues).map(intToHex).join('');\n}\n\nfunction intToHex(nr: number) {\n  return nr.toString(16).padStart(2, '0');\n}\n<\/code><\/pre>\n<\/div>\n<h3>\ub85c\uadf8\uc778<\/h3>\n<p>\uc778\uc99d\uc744 \uc2dc\uc791\ud558\uace0 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ud50c\ub85c\uc6b0\ub97c \uc2dc\uc791\ud569\ub2c8\ub2e4.<\/p>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-js\">import { CognitoUser } from 'amazon-cognito-identity-js';\n\nlet cognitoUser: CognitoUser; \/\/ Track authentication flow state in this object\nexport async function signIn(email: string) {\n    cognitoUser = await Auth.signIn(email);\n}\n<\/code><\/pre>\n<\/div>\n<h3>\uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ubb38\uc81c\uc5d0 \ub2f5\ubcc0 \uc81c\uacf5<\/h3>\n<p>\uc0ac\uc6a9\uc790\ub294 \uba54\uc77c\uc744 \ud655\uc778\ud558\uace0 \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uac80\uc0c9\ud574\uc57c \ud569\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uac00 \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uc785\ub825\ud558\uba74 AWS Amplify\ub97c \ud638\ucd9c\ud558\uc5ec \uc0ac\uc6a9\uc790 \ud480\uc5d0 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ubb38\uc81c\uc758 \ub2f5\ubcc0\uc73c\ub85c \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uc804\uc1a1\ud569\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c, \ub2e4\uc74c \uc138 \uac00\uc9c0 \uc0c1\ud669 \uc911 \ud558\ub098\uac00 \uc9c4\ud589\ub420 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li>\uc0ac\uc6a9\uc790\uac00 \uc62c\ubc14\ub978 \ucf54\ub4dc\ub97c \uc785\ub825\ud588\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790 \ud480\uc5d0\uc11c JWT\ub97c \uc0ac\uc6a9\ud558\uc5ec AWS Amplify\uc5d0 \uc751\ub2f5\ud558\uace0, AWS Amplify\ub294 \uc774 \ucf54\ub4dc\ub97c \uc0ac\uc6a9\uc790 \ube0c\ub77c\uc6b0\uc800(\uae30\ubcf8\uc801\uc73c\ub85c \ub85c\uceec \uc2a4\ud1a0\ub9ac\uc9c0)\uc5d0 \uc800\uc7a5\ud569\ub2c8\ub2e4.<\/li>\n<li>\uc0ac\uc6a9\uc790\uac00 \uc62c\ubc14\ub978 \ucf54\ub4dc\ub97c \uc785\ub825\ud558\uc9c0 \uc54a\uc558\uc9c0\ub9cc, \uc544\uc9c1 3\ubc88\uc9f8 \uc2dc\ub3c4\uac00 \uc544\ub2c8\ubbc0\ub85c \uc62c\ubc14\ub978 \ucf54\ub4dc\ub97c \uc785\ub825\ud560 \uae30\ud68c\uac00 \uc544\uc9c1 \ub0a8\uc558\uc2b5\ub2c8\ub2e4.<\/li>\n<li>\uc0ac\uc6a9\uc790\uac00 \uc62c\ubc14\ub978 \ucf54\ub4dc\ub97c \uc785\ub825\ud558\uc9c0 \uc54a\uc558\uace0 \ubc8c\uc368 3\ubc88\uc9f8 \uc2dc\ub3c4\uc774\ubbc0\ub85c \uc778\uc99d\uc774 \uc2e4\ud328\ud569\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\ub294 \ub85c\uadf8\uc778 \ud398\uc774\uc9c0\ub85c \ub3cc\uc544\uac00 \uc0c8 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \uc2dc\uc791\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<div class=\"hide-language\">\n<pre class=\"unlimited-height-code\"><code class=\"lang-js\">export async function answerCustomChallenge(answer: string) {\n\n    \/\/ Send the answer to the User Pool\n    \/\/ This will throw an error if it\u2019s the 3rd wrong answer\n    cognitoUser = await Auth.sendCustomChallengeAnswer(cognitoUser, answer);\n\n    \/\/ It we get here, the answer was sent successfully,\n    \/\/ but it might have been wrong (1st or 2nd time)\n    \/\/ So we should test if the user is authenticated now\n    try {\n        \/\/ This will throw an error if the user is not yet authenticated:\n        await Auth.currentSession();\n    } catch {\n        console.log('Apparently the user did not enter the right code');\n    }\n\n}\n<\/code><\/pre>\n<\/div>\n<h3>\uc81c\ud55c \uc2dc\uac04 3\ubd84<\/h3>\n<p>\uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ubb38\uc81c\uac00 \uc81c\uacf5\ub41c \ud6c4 \uc774\uba54\uc77c\uc5d0\uc11c \uc2e4\uc81c\ub85c \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uac80\uc0c9\ud558\uace0 \ub2f5\ubcc0\uc73c\ub85c \uc774 \ucf54\ub4dc\ub97c \uc81c\uacf5\ud558\ub294 \ub370 3\ubd84\uc758 \uc2dc\uac04\uc774 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc8fc\uc5b4\uc9d1\ub2c8\ub2e4. \uc774 \uc2dc\uac04\uc774 \uc9c0\ub098\uba74 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0 \uc81c\ud55c \uc2dc\uac04\uc774 \ucd08\uacfc\ub418\uace0 \uc0ac\uc6a9\uc790\ub294 \uc0c8 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \uc2dc\uc791\ud558\uc5ec \uc0c8 \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \ubc1b\uc544\uc57c \ud569\ub2c8\ub2e4. \uc774 3\ubd84\uc758 \uc81c\ud55c \uc2dc\uac04\uc740 Amazon Cognito\uc5d0 \uc758\ud574 \uc11c\ubc84 \uce21\uc5d0\uc11c \uc2dc\ud589\ub429\ub2c8\ub2e4. Multi-Factor Authentication(MFA)\uc758 \ucf54\ub4dc \uc785\ub825 \uc81c\ud55c \uc2dc\uac04\uacfc \ub3d9\uc77c\ud569\ub2c8\ub2e4.<\/p>\n<h2>\uc694\uc57d<\/h2>\n<p>Amazon Cognito \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d \ud50c\ub85c\uc6b0\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc774\uba54\uc77c\ub85c \ubc1b\uc740 \ubcf4\uc548 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \ud1b5\ud574 \uc554\ud638 \uc5c6\ub294 \uc778\uc99d\uc744 \uad6c\ud604\ud588\uc2b5\ub2c8\ub2e4. \uc6f9 \uc0ac\uc774\ud2b8 \ub610\ub294 \uc571\uc758 \ubcf4\uc548 \uc694\uad6c \uc0ac\ud56d\uc5d0 \ub530\ub77c, \uc774 \uc194\ub8e8\uc158\uc744 \uc0ac\uc6a9\ud558\uc5ec \ubcf4\uc548\uacfc \uc0ac\uc6a9\uc790 \ud3b8\uc774\uc131 \uc0ac\uc774\uc5d0\uc11c \uc801\uc808\ud55c \uade0\ud615\uc744 \ub9de\ucd9c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc194\ub8e8\uc158\uc740 Lambda \ud568\uc218\uc5d0\uc11c \uad6c\ucd95\ub418\uc5c8\uae30 \ub54c\ubb38\uc5d0 \ud544\uc694\uc5d0 \ub530\ub77c \ud655\uc7a5\ud558\uace0 \uc870\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/docs.aws.amazon.com\/cognito\/latest\/developerguide\/user-pool-lambda-challenge.html\">\uac1c\ubc1c\uc790 \uc548\ub0b4\uc11c<\/a>\uc5d0\uc11c \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc778\uc99d\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc54c\uc544\ubcf4\uace0 \ucf54\ub529\ud574 \ubcf4\uc2ed\uc2dc\uc624!<\/p>\n<p>\uc5b8\uc81c\ub098 \uadf8\ub807\ub4ef\uc774 AWS\ub294 \uc5ec\ub7ec\ubd84\uc758 \uc758\uacac\uc5d0 \uadc0\ub97c \uae30\uc6b8\uc785\ub2c8\ub2e4. \uc544\ub798\uc5d0 \ub313\uae00\uc744 \ub2ec\uac70\ub098 <a href=\"https:\/\/forums.aws.amazon.com\/forum.jspa?forumID=173\">AWS Cognito \ud3ec\ub7fc<\/a>\uc5d0\uc11c \uc758\uacac\uc744 \uac8c\uc7ac\ud558\uc2e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\ub9ac\uc18c\uc2a4<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/aws-samples\/amazon-cognito-passwordless-email-auth\">GitHub\uc5d0\uc11c \ucf54\ub4dc<\/a>\ub97c \ubcf4\uace0 \uc0d8\ud50c \uc194\ub8e8\uc158\uc744 \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc54c\uc544\ubcf4\uc2ed\uc2dc\uc624. \uc9c1\uc811 \ucf54\ub4dc\ub97c \ubc30\ud3ec\ud558\uace0 \uc2e4\ud589\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><a href=\"https:\/\/serverlessrepo.aws.amazon.com\/applications\/arn:aws:serverlessrepo:us-east-1:520945424137:applications~amazon-cognito-passwordless-email-auth\">AWS Serverless Application Repository<\/a>\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc0d8\ud50c \uc194\ub8e8\uc158\uc5d0\uc11c Amazon Cognito \ub9ac\uc18c\uc2a4\ub97c \ubc30\ud3ec\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<p>\u2013 Ott Kruse;<\/p>\n<p><em>Otto Kruse\ub294 \ub124\ub35c\ub780\ub4dc \uae30\ubc18 \uc804\ubb38 \uc11c\ube44\uc2a4 \ucee8\uc124\ud134\ud2b8\uc774\uba70, \uc571 \uac1c\ubc1c \uc0ac\ub840\ub97c \uc911\uc810\uc801\uc73c\ub85c \ub2e4\ub8f9\ub2c8\ub2e4.<\/em><\/p>\n<p>Source: <a href=\"https:\/\/aws.amazon.com\/ko\/blogs\/korea\/implementing-passwordless-email-authentication-with-amazon-cognito\/\" target=\"_blank\" rel=\"noopener noreferrer\">Amazon Cognito \uae30\ubc18 \uc554\ud638\uac00 \ubd88\ud544\uc694\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc774\uba54\uc77c \uc778\uc99d \uad6c\ud604 \ubc29\ubc95<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div class=\"mh-excerpt\"><p>Amazon Cognito \uae30\ubc18 \uc554\ud638\uac00 \ubd88\ud544\uc694\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc774\uba54\uc77c \uc778\uc99d \uad6c\ud604 \ubc29\ubc95 \ub300\uccb4\ub85c \uc6f9 \uc0ac\uc774\ud2b8\uc5d0\uc11c \uc554\ud638\ub97c \uae30\uc5b5\ud558\uace0 \uc788\uae30\ub780 \uc27d\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \ud2b9\ud788 \uc790\uc8fc \uc0ac\uc6a9\ud558\uc9c0 \uc54a\ub294 \uc554\ud638\ub77c\uba74 \ub354\uc6b1 \uadf8\ub807\uc9c0\uc694. \ub300\ubd80\ubd84\uc758 \uc0ac\ub78c\ucc98\ub7fc, \uc5ec\ub7ec\ubd84\ub3c4 \uc6f9 \uc0ac\uc774\ud2b8\uc640 \uc571\uc5d0\uc11c \u201c\uc554\ud638\ub97c \uc78a\uc5b4\ubc84\ub9ac\uc168\uc2b5\ub2c8\uae4c?\u201d \ub9c1\ud06c\ub098 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud558\ub294 \uc77c\uc774 \uaf64 \uc775\uc219\ud560\uc9c0\ub3c4 \ubaa8\ub985\ub2c8\ub2e4. \uadf8\ub798\uc11c \ub9ce\uc740 \uc0ac\ub78c\uc774 \uc9e7\uc740 \uc554\ud638\ub97c \uc0ac\uc6a9\ud558\uac70\ub098 \ub5a0\uc62c\ub9ac\uae30 \uc26c\uc6b4 \uc554\ud638\ub97c \uc0ac\uc6a9\ud558\uac70\ub098 \uc5ec\ub7ec \uc0ac\uc774\ud2b8\uc640 \uc571\uc5d0\uc11c \uac19\uc740 \uc554\ud638\ub97c \uc7ac\uc0ac\uc6a9\ud558\ub294 \ub4f1 \uc798\ubabb\ub41c \ubc29\ubc95\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\ud5a5\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc554\ud638 \uad00\ub9ac\uc790\ucc98\ub7fc, \uc774\ub97c \uc704\ud55c \uc194\ub8e8\uc158\ub3c4 \uc788\uc9c0\ub9cc, \uc2e4\uc81c\ub85c \uc554\ud638\uc5d0 \uae30\ubc18\ud55c \ubcf4\uc548\uc740 \uc548\uc804\ud558\uc9c0 \uc54a\uc73c\uba70, \ud2b9\ud788 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uce5c\uc219\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. \uc9c0\ubb38\uc774\ub098 \uc5bc\uad74 \uc778\uc2dd\uc744 \uc0ac\uc6a9\ud558\ub294 \ub4f1 \uc554\ud638 \ub85c\uadf8\uc778\uc744 \ub300\uccb4\ud558\ub294 \ubc29\ubc95\ub3c4 \uc788\uae34 \ud569\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \ud56d\uc0c1 \uc774\ub7ec\ud55c \ubc29\ubc95\uc774 \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uac83\uc740 \uc544\ub2d9\ub2c8\ub2e4. \uc190\uc27d\uac8c \uc778\uc99d \uc11c\ube44\uc2a4\ub97c \uad6c\ud604\ud558\uac8c \ud574 \uc8fc\ub294 Amazon Cognito\uc5d0\uc11c\ub294 \ub300\uc548\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ub85c\uadf8\uc778\ud560 \ub54c \uc608\ub97c \ub4e4\uc5b4, \uc774\uba54\uc77c, SMS \ub610\ub294 \ud478\uc2dc \uc54c\ub9bc\uc744 \ud1b5\ud574 \uc6f9 \uc0ac\uc774\ud2b8\ub098 \uc571\uc5d0\uc11c \uc784\uc2dc \uc77c\ud68c\uc131 \ub85c\uadf8\uc778 \ucf54\ub4dc\ub97c \uc0ac\uc6a9\uc790\uc5d0\uac8c \ubcf4\ub0b4\uae30\ub9cc \ud558\uace0, \uc554\ud638\ub97c \uc785\ub825\ud558\uc9c0 \uc54a\uc544\ub3c4 \ub41c\ub2e4\uba74 \uc5b4\ub5a8\uae4c\uc694? \uadf8\ub0e5 \ucf54\ub4dc\ub97c \ubc1b\uc544\uc11c \uc785\ub825\ud558\uace0 \ub85c\uadf8\uc778\ud558\uba74 \ub429\ub2c8\ub2e4. \u201c\uc554\ud638\ub97c \uc78a\uc5b4\ubc84\ub9ac\uc168\uc2b5\ub2c8\uae4c\u201d <a class=\"mh-excerpt-more\" href=\"https:\/\/jirak.net\/wp\/amazon-cognito-%ea%b8%b0%eb%b0%98-%ec%95%94%ed%98%b8%ea%b0%80-%eb%b6%88%ed%95%84%ec%9a%94%ed%95%9c-%ec%84%9c%eb%b2%84%eb%a6%ac%ec%8a%a4-%ec%9d%b4%eb%a9%94%ec%9d%bc-%ec%9d%b8%ec%a6%9d-%ea%b5%ac\/\" title=\"Amazon Cognito \uae30\ubc18 \uc554\ud638\uac00 \ubd88\ud544\uc694\ud55c \uc11c\ubc84\ub9ac\uc2a4 \uc774\uba54\uc77c \uc778\uc99d \uad6c\ud604 \ubc29\ubc95\">[ more&#8230; ]<\/a><\/p>\n<\/div>","protected":false},"author":1,"featured_media":31280,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[169],"tags":[656],"class_list":["post-31279","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-news","tag-aws"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/31279","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/comments?post=31279"}],"version-history":[{"count":1,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/31279\/revisions"}],"predecessor-version":[{"id":31281,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/posts\/31279\/revisions\/31281"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/media\/31280"}],"wp:attachment":[{"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/media?parent=31279"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/categories?post=31279"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jirak.net\/wp\/wp-json\/wp\/v2\/tags?post=31279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}