> = ({ match }) => {
+ return (
+
+
+
+ );
+};
+
+export default QRCodePage;
diff --git a/WEB/FE/src/pages/SignUpPage.tsx b/WEB/FE/src/pages/SignUpPage.tsx
new file mode 100644
index 00000000..67a7f168
--- /dev/null
+++ b/WEB/FE/src/pages/SignUpPage.tsx
@@ -0,0 +1,13 @@
+import React from 'react';
+import SignUpComponent from '@components/SignUpComponent/SignUpComponent';
+import { AuthPageLayout } from '@layouts/AuthPageLayout';
+
+const SignUpPage = () => {
+ return (
+
+
+
+ );
+};
+
+export default SignUpPage;
diff --git a/WEB/FE/src/pages/StudyPage.tsx b/WEB/FE/src/pages/StudyPage.tsx
new file mode 100644
index 00000000..fba80479
--- /dev/null
+++ b/WEB/FE/src/pages/StudyPage.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { MainPageLayout } from '@layouts/MainPageLayout';
+import { StudyComponent } from '@components/StudyComponent/StudyComponent';
+
+interface StudyPageProps {}
+
+function StudyPage({}: StudyPageProps): JSX.Element {
+ return (
+
+
+
+ );
+}
+
+export default StudyPage;
diff --git a/WEB/FE/src/pages/TOTPIntroPage.tsx b/WEB/FE/src/pages/TOTPIntroPage.tsx
new file mode 100644
index 00000000..ea87f2ff
--- /dev/null
+++ b/WEB/FE/src/pages/TOTPIntroPage.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { MainPageLayout } from '@layouts/MainPageLayout';
+import { TOTPIntroContainer } from '@components/TOTPIntro/TOTPIntroContainer';
+
+interface TOTPIntroPageProps {}
+
+function TOTPIntroPage({}: TOTPIntroPageProps): JSX.Element {
+ return (
+
+
+
+ );
+}
+
+export default TOTPIntroPage;
diff --git a/WEB/FE/src/pages/Why2FAPage.tsx b/WEB/FE/src/pages/Why2FAPage.tsx
new file mode 100644
index 00000000..f8bbc6b4
--- /dev/null
+++ b/WEB/FE/src/pages/Why2FAPage.tsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { MainPageLayout } from '@layouts/MainPageLayout';
+import { Why2FAContainer } from '@components/Why2FA/Why2FAContainer';
+
+interface Why2FAPageProps {}
+
+function Why2FAPage({}: Why2FAPageProps): JSX.Element {
+ return (
+
+
+
+ );
+}
+
+export default Why2FAPage;
diff --git a/WEB/FE/src/pages/findIDPage.tsx b/WEB/FE/src/pages/findIDPage.tsx
new file mode 100644
index 00000000..08da9d8e
--- /dev/null
+++ b/WEB/FE/src/pages/findIDPage.tsx
@@ -0,0 +1,14 @@
+import React from 'react';
+
+import { FindIDComponent } from '@components/findID/findIDComponent';
+import { AuthPageLayout } from '@layouts/AuthPageLayout';
+
+const SignUpPage = (): JSX.Element => {
+ return (
+
+
+
+ );
+};
+
+export default SignUpPage;
diff --git a/WEB/FE/src/pages/index.tsx b/WEB/FE/src/pages/index.tsx
new file mode 100644
index 00000000..9fdb7322
--- /dev/null
+++ b/WEB/FE/src/pages/index.tsx
@@ -0,0 +1,12 @@
+export { default as SignUpPage } from '@pages/SignUpPage';
+export { default as QRCodePage } from '@pages/QRCodePage';
+export { default as LogInPage } from '@pages/LogInPage';
+export { default as findIDPage } from '@pages/findIDPage';
+export { default as NotFoundPage } from '@pages/NotFoundPage';
+export { default as FindPasswordPage } from '@pages/FindPasswordPage';
+export { default as ChangePasswordPage } from '@/pages/ChangePasswordPage';
+export { default as MyPage } from '@/pages/MyPage';
+export { default as IndexPage } from '@/pages/IndexPage';
+export { default as Why2FAPage } from '@/pages/Why2FAPage';
+export { default as TOTPIntroPage } from '@/pages/TOTPIntroPage';
+export { default as StudyPage } from '@/pages/StudyPage';
diff --git a/WEB/FE/src/stories/Introduction.stories.mdx b/WEB/FE/src/stories/Introduction.stories.mdx
new file mode 100644
index 00000000..0a5d450a
--- /dev/null
+++ b/WEB/FE/src/stories/Introduction.stories.mdx
@@ -0,0 +1,207 @@
+import { Meta } from '@storybook/addon-docs/blocks';
+import Code from './assets/code-brackets.svg';
+import Colors from './assets/colors.svg';
+import Comments from './assets/comments.svg';
+import Direction from './assets/direction.svg';
+import Flow from './assets/flow.svg';
+import Plugin from './assets/plugin.svg';
+import Repo from './assets/repo.svg';
+import StackAlt from './assets/stackalt.svg';
+
+
+
+
+
+# Welcome to Storybook
+
+Storybook helps you build UI components in isolation from your app's business logic, data, and context.
+That makes it easy to develop hard-to-reach states. Save these UI states as **stories** to revisit during development, testing, or QA.
+
+Browse example stories now by navigating to them in the sidebar.
+View their code in the `src/storybook-examples` directory to learn how they work.
+We recommend building UIs with a [**component-driven**](https://componentdriven.org) process starting with atomic components and ending with pages.
+
+Configure
+
+
+
+Learn
+
+
+
+
+ TipEdit the Markdown in{' '}
+ src/storybook-examples/welcome.mdx
+
diff --git a/WEB/FE/src/stories/LogInForm.stories.jsx b/WEB/FE/src/stories/LogInForm.stories.jsx
new file mode 100644
index 00000000..c7d39fbf
--- /dev/null
+++ b/WEB/FE/src/stories/LogInForm.stories.jsx
@@ -0,0 +1,13 @@
+import React from 'react';
+import { LogInForm } from '@components/LogIn/LogInForm';
+
+export default {
+ title: 'LogIn/LogInForm',
+ component: LogInForm,
+};
+
+export const loginForm = () => (
+
+
+
+);
diff --git a/WEB/FE/src/stories/TOTPModal.stories.jsx b/WEB/FE/src/stories/TOTPModal.stories.jsx
new file mode 100644
index 00000000..dde819b3
--- /dev/null
+++ b/WEB/FE/src/stories/TOTPModal.stories.jsx
@@ -0,0 +1,15 @@
+import React from 'react';
+import { MemoryRouter } from 'react-router-dom';
+import { TOTPModal } from '@components/TOTPModal/TOTPModal';
+import { text, boolean } from '@storybook/addon-knobs';
+
+export default {
+ title: 'common/TOTPModal',
+ component: TOTPModal,
+};
+
+export const totpModal = () => (
+
+
+
+);
diff --git a/WEB/FE/src/stories/assets/code-brackets.svg b/WEB/FE/src/stories/assets/code-brackets.svg
new file mode 100644
index 00000000..73de9477
--- /dev/null
+++ b/WEB/FE/src/stories/assets/code-brackets.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/src/stories/assets/colors.svg b/WEB/FE/src/stories/assets/colors.svg
new file mode 100644
index 00000000..17d58d51
--- /dev/null
+++ b/WEB/FE/src/stories/assets/colors.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/src/stories/assets/comments.svg b/WEB/FE/src/stories/assets/comments.svg
new file mode 100644
index 00000000..6493a139
--- /dev/null
+++ b/WEB/FE/src/stories/assets/comments.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/src/stories/assets/direction.svg b/WEB/FE/src/stories/assets/direction.svg
new file mode 100644
index 00000000..65676ac2
--- /dev/null
+++ b/WEB/FE/src/stories/assets/direction.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/src/stories/assets/flow.svg b/WEB/FE/src/stories/assets/flow.svg
new file mode 100644
index 00000000..8ac27db4
--- /dev/null
+++ b/WEB/FE/src/stories/assets/flow.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/src/stories/assets/plugin.svg b/WEB/FE/src/stories/assets/plugin.svg
new file mode 100644
index 00000000..29e5c690
--- /dev/null
+++ b/WEB/FE/src/stories/assets/plugin.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/src/stories/assets/repo.svg b/WEB/FE/src/stories/assets/repo.svg
new file mode 100644
index 00000000..f386ee90
--- /dev/null
+++ b/WEB/FE/src/stories/assets/repo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/src/stories/assets/stackalt.svg b/WEB/FE/src/stories/assets/stackalt.svg
new file mode 100644
index 00000000..9b7ad274
--- /dev/null
+++ b/WEB/FE/src/stories/assets/stackalt.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/src/styles/GlobalStyle.ts b/WEB/FE/src/styles/GlobalStyle.ts
new file mode 100644
index 00000000..664408c3
--- /dev/null
+++ b/WEB/FE/src/styles/GlobalStyle.ts
@@ -0,0 +1,101 @@
+import { css, createGlobalStyle } from 'styled-components';
+
+export const resetCss = css`
+ /* prettier-ignore */
+ html, body, div, span, applet, object, iframe,
+ h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+ a, abbr, acronym, address, big, cite, code,
+ del, dfn, em, img, ins, kbd, q, s, samp,
+ small, strike, strong, sub, sup, tt, var,
+ b, u, i, center,
+ dl, dt, dd, ol, ul, li,
+ fieldset, form, label, legend,
+ table, caption, tbody, tfoot, thead, tr, th, td,
+ article, aside, canvas, details, embed,
+ figure, figcaption, footer, header, hgroup,
+ menu, nav, output, ruby, section, summary,
+ time, mark, audio, video {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-size: 100%;
+ vertical-align: baseline;
+ box-sizing: border-box;
+ }
+ html,
+ #app {
+ width: 100%;
+ height: 100%;
+ }
+ body {
+ width: 100%;
+ height: 100%;
+ color: #333;
+ font-size: 100%;
+ font-weight: 500;
+ line-height: 1.2;
+ font-family: 'SpocaHanSans', -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo',
+ 'Malgun Gothic', '맑은 고딕', 나눔고딕, 'Nanum Gothic', 'Noto Sans KR', 'Noto Sans CJK KR', arial, 돋움,
+ Dotum, Tahoma, Geneva, sans-serif;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+ box-sizing: border-box;
+ }
+ * {
+ box-sizing: inherit;
+ }
+ input,
+ button,
+ textarea {
+ font-family: inherit;
+ }
+ /* prettier-ignore */
+ article, aside, details, figcaption, figure,
+ footer, header, hgroup, menu, nav, section {
+ display: block;
+ }
+ ol,
+ ul {
+ list-style: none;
+ }
+ blockquote,
+ q {
+ quotes: none;
+ }
+ /* prettier-ignore */
+ blockquote:before, blockquote:after,
+ q:before, q:after {
+ content: '';
+ content: none;
+ }
+ table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ }
+ a {
+ text-decoration: none;
+ color: inherit;
+ }
+ a:link {
+ text-decoration: none;
+ }
+ a:visited {
+ text-decoration: none;
+ }
+ a:hover {
+ text-decoration: none;
+ }
+ input {
+ outline: 0;
+ font-weight: 500;
+ }
+ button {
+ outline: 0;
+ cursor: pointer;
+ font-weight: 500;
+ }
+`;
+
+export const GlobalStyle = createGlobalStyle`
+ ${resetCss}
+`;
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansBold.ttf b/WEB/FE/src/styles/fonts/SpoqaHanSansBold.ttf
new file mode 100644
index 00000000..00f6e1ae
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansBold.ttf differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansBold.woff b/WEB/FE/src/styles/fonts/SpoqaHanSansBold.woff
new file mode 100644
index 00000000..e793d7b5
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansBold.woff differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansBold.woff2 b/WEB/FE/src/styles/fonts/SpoqaHanSansBold.woff2
new file mode 100644
index 00000000..2133aeed
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansBold.woff2 differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansLight.ttf b/WEB/FE/src/styles/fonts/SpoqaHanSansLight.ttf
new file mode 100644
index 00000000..e79f5e8b
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansLight.ttf differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansLight.woff b/WEB/FE/src/styles/fonts/SpoqaHanSansLight.woff
new file mode 100644
index 00000000..ee141f0d
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansLight.woff differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansLight.woff2 b/WEB/FE/src/styles/fonts/SpoqaHanSansLight.woff2
new file mode 100644
index 00000000..132260ab
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansLight.woff2 differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.ttf b/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.ttf
new file mode 100644
index 00000000..2959c8ec
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.ttf differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.woff b/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.woff
new file mode 100644
index 00000000..0389d83d
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.woff differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.woff2 b/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.woff2
new file mode 100644
index 00000000..4e63efaf
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansRegular.woff2 differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansThin.ttf b/WEB/FE/src/styles/fonts/SpoqaHanSansThin.ttf
new file mode 100644
index 00000000..0cd6021b
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansThin.ttf differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansThin.woff b/WEB/FE/src/styles/fonts/SpoqaHanSansThin.woff
new file mode 100644
index 00000000..4d8d33e5
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansThin.woff differ
diff --git a/WEB/FE/src/styles/fonts/SpoqaHanSansThin.woff2 b/WEB/FE/src/styles/fonts/SpoqaHanSansThin.woff2
new file mode 100644
index 00000000..974f44bc
Binary files /dev/null and b/WEB/FE/src/styles/fonts/SpoqaHanSansThin.woff2 differ
diff --git a/WEB/FE/src/styles/theme.ts b/WEB/FE/src/styles/theme.ts
new file mode 100644
index 00000000..11a5546f
--- /dev/null
+++ b/WEB/FE/src/styles/theme.ts
@@ -0,0 +1,42 @@
+export enum Colors {
+ grayBrown = '#5C4D43',
+ puple = '#3F3D56',
+ mustard = '#C57A07',
+ black = '#000000',
+ gray = '#D9D8DD',
+ white = '#FFFFFF',
+ border = '#eaecef',
+ darkerBorder = '#ddd',
+ headerBg = '#FFFFFF',
+ danger = '#ff4d4f',
+ link = '#4192F1',
+ tableHeader = '#F3F2F6',
+ primary = '#3B589B',
+ text = '#333333',
+}
+
+export enum FontSize {
+ xl = '32px',
+ lg = '20px',
+ md = '16px',
+ sm = '14px',
+ xs = '12px',
+}
+
+export enum FontWeight {
+ thin = 200,
+ light = 300,
+ regular = 500,
+ bold = 700,
+}
+
+export enum Size {
+ pageWidth = '1280px',
+}
+
+export const theme = {
+ color: Colors,
+ fontSize: FontSize,
+ fontWeight: FontWeight,
+ size: Size,
+};
diff --git a/WEB/FE/src/styles/typography.css b/WEB/FE/src/styles/typography.css
new file mode 100644
index 00000000..bd10deee
--- /dev/null
+++ b/WEB/FE/src/styles/typography.css
@@ -0,0 +1,43 @@
+@font-face {
+ font-display: swap;
+ font-family: "SpocaHanSans";
+ font-weight: 200;
+ font-style: normal;
+ src: local('SpoqaHanSansThin'), local('Spoqa Han Sans Thin'),
+ url('@styles/fonts/SpoqaHanSansThin.woff2') format('woff2'),
+ url('@styles/fonts/SpoqaHanSansThin.woff') format('woff'),
+ url('@styles/fonts/SpoqaHanSansThin.ttf') format('ttf');
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "SpocaHanSans";
+ font-weight: 300;
+ font-style: normal;
+ src: local('SpoqaHanSansLight'), local('Spoqa Han Sans Light'),
+ url('@styles/fonts/SpoqaHanSansLight.woff2') format('woff2'),
+ url('@styles/fonts/SpoqaHanSansLight.woff') format('woff'),
+ url('@styles/fonts/SpoqaHanSansLight.ttf') format('ttf');
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "SpocaHanSans";
+ font-weight: 500;
+ font-style: normal;
+ src: local('SpoqaHanSansRegular'), local('Spoqa Han Sans Regular'),
+ url('@styles/fonts/SpoqaHanSansRegular.woff2') format('woff2'),
+ url('@styles/fonts/SpoqaHanSansRegular.woff') format('woff'),
+ url('@styles/fonts/SpoqaHanSansRegular.ttf') format('ttf');
+}
+
+@font-face {
+ font-display: swap;
+ font-family: "SpocaHanSans";
+ font-weight: 700;
+ font-style: normal;
+ src: local('SpoqaHanSansBold'), local('Spoqa Han Sans Bold'),
+ url('@styles/fonts/SpoqaHanSansBold.woff2') format('woff2'),
+ url('@styles/fonts/SpoqaHanSansBold.woff') format('woff'),
+ url('@styles/fonts/SpoqaHanSansBold.ttf') format('ttf');
+}
diff --git a/WEB/FE/src/types/apiType.ts b/WEB/FE/src/types/apiType.ts
new file mode 100644
index 00000000..45894b08
--- /dev/null
+++ b/WEB/FE/src/types/apiType.ts
@@ -0,0 +1,98 @@
+export interface UserInfo {
+ id: string;
+ password: string;
+ email: string;
+ birth: string;
+ name: string;
+ phone: string;
+ reCaptchaToken: string;
+}
+
+export interface loginWithPasswordParams {
+ id: string;
+ password: string;
+ reCaptchaToken: string;
+}
+
+export interface loginWithPasswordResponse {
+ authToken: string;
+}
+
+export interface loginWithOTPParams {
+ authToken: string;
+ totp: string;
+ reCaptchaToken: string;
+}
+
+export interface loginWithOTPResponse {
+ userName: string;
+}
+
+export interface findPasswordWithOTPParams {
+ authToken: string;
+ totp: string;
+ reCaptchaToken: string;
+}
+
+export interface findIdParams {
+ email: string;
+ name: string;
+ birth: string;
+ reCaptchaToken: string;
+}
+
+export interface findPasswordParams {
+ id: string;
+ name: string;
+ birth: string;
+ reCaptchaToken: string;
+}
+
+export interface findPasswordReturn {
+ message: string;
+ authToken: string;
+}
+
+/// ////////////////////
+export interface getUserReturn {
+ user: {
+ birth: string;
+ email: string;
+ name: string;
+ phone: string;
+ };
+}
+
+export interface updateUserParmas {
+ name?: string;
+ email?: string;
+ phone?: string;
+ birth?: string;
+}
+
+export interface receiveLogsReturn {
+ key: string;
+ time: string;
+ device: string;
+ ip: string;
+ location: string;
+ isLoggedOut: boolean;
+ sessionId: string | undefined;
+}
+
+export interface delSessionParmas {
+ sid?: string;
+}
+
+export interface sendPasswordParams {
+ password: string;
+}
+
+export interface sendSecretKeyEmailParams {
+ authToken: string;
+ reCaptchaToken: string;
+}
+
+export interface reSendReturn {
+ message: string;
+}
diff --git a/WEB/FE/src/types/import-file.d.ts b/WEB/FE/src/types/import-file.d.ts
new file mode 100644
index 00000000..d7b15ece
--- /dev/null
+++ b/WEB/FE/src/types/import-file.d.ts
@@ -0,0 +1,14 @@
+declare module '*.svg' {
+ const value: any;
+ export default value;
+}
+
+declare module '*.jpg' {
+ const value: any;
+ export default value;
+}
+
+declare module '*.png' {
+ const value: any;
+ export default value;
+}
diff --git a/WEB/FE/src/types/missingTypes.d.ts b/WEB/FE/src/types/missingTypes.d.ts
new file mode 100644
index 00000000..a3889b7e
--- /dev/null
+++ b/WEB/FE/src/types/missingTypes.d.ts
@@ -0,0 +1 @@
+declare module 'react-google-recaptcha-v3';
diff --git a/WEB/FE/src/utils/initialData.ts b/WEB/FE/src/utils/initialData.ts
new file mode 100644
index 00000000..16908e30
--- /dev/null
+++ b/WEB/FE/src/utils/initialData.ts
@@ -0,0 +1,53 @@
+import svgTimeStamp from '@static/TimeStamp.svg';
+import svgSecretKey from '@static/SecretKey.svg';
+import svgHMAC from '@static/HMAC.svg';
+import svgTruncation from '@static/Truncation.svg';
+import svgOTP from '@static/OTP.svg';
+
+interface ArrayData {
+ [timeStamp1: string]: { [left: string]: number };
+}
+
+const initialArrayData: ArrayData = {
+ timeStamp1: { left: 213, top: 80, width: 80, height: 71 },
+ secretKey1: { left: 364, top: 80, width: 80, height: 71 },
+ hmac1: { left: 209, top: 184, width: 240, height: 69 },
+ truncation1: { left: 209, top: 286, width: 240, height: 69 },
+ otp1: { left: 234, top: 388, width: 187, height: 69 },
+ timeStamp2: { left: 805, top: 80, width: 80, height: 71 },
+ secretKey2: { left: 968, top: 80, width: 80, height: 71 },
+ hmac2: { left: 806, top: 183, width: 240, height: 69 },
+ truncation2: { left: 806, top: 286, width: 240, height: 69 },
+ otp2: { left: 833, top: 387, width: 187, height: 69 },
+ list: { width: 1028, height: 180 },
+};
+
+interface StudyDataProps {
+ [list: string]: { [name: string]: string }[];
+}
+
+const initialStudyData: StudyDataProps = {
+ list: [
+ { name: 'timeStamp1', svg: svgTimeStamp },
+ { name: 'secretKey1', svg: svgSecretKey },
+ { name: 'hmac1', svg: svgHMAC },
+ { name: 'truncation1', svg: svgTruncation },
+ { name: 'otp1', svg: svgOTP },
+ { name: 'timeStamp2', svg: svgTimeStamp },
+ { name: 'secretKey2', svg: svgSecretKey },
+ { name: 'hmac2', svg: svgHMAC },
+ { name: 'truncation2', svg: svgTruncation },
+ { name: 'otp2', svg: svgOTP },
+ ],
+ timeStamp1: [],
+ secretKey1: [],
+ hmac1: [],
+ truncation1: [],
+ otp1: [],
+ timeStamp2: [],
+ secretKey2: [],
+ hmac2: [],
+ truncation2: [],
+ otp2: [],
+};
+export { initialArrayData, initialStudyData };
diff --git a/WEB/FE/src/utils/localStorage.ts b/WEB/FE/src/utils/localStorage.ts
new file mode 100644
index 00000000..a459311c
--- /dev/null
+++ b/WEB/FE/src/utils/localStorage.ts
@@ -0,0 +1,17 @@
+const STORAGE_KEY = '_ddis_user';
+
+const storageHandler = {
+ set(userName: string): void {
+ localStorage.setItem(STORAGE_KEY, userName);
+ },
+
+ get(): string | null {
+ return localStorage.getItem(STORAGE_KEY);
+ },
+
+ clear(): void {
+ localStorage.clear();
+ },
+};
+
+export default storageHandler;
diff --git a/WEB/FE/src/utils/message.ts b/WEB/FE/src/utils/message.ts
new file mode 100644
index 00000000..943e0339
--- /dev/null
+++ b/WEB/FE/src/utils/message.ts
@@ -0,0 +1,19 @@
+export enum message {
+ IDNOTCONDITION = '아이디가 조건에 맞지 않습니다.',
+ PASSWORDNOTCONDITION = '비밀번호가 조건에 맞지 않습니다.',
+ PASSWORDNOTACCORD = '비밀번호가 일치하지 않습니다.',
+ SOMETHINGNOTINPUT = '입력되지 않은 값이 있습니다.',
+ ALREADYID = '이미존재하는 아이디 입니다.',
+ POSSIBLEID = '사용가능한 아이디 입니다.',
+ ALREADYEMAIL = '이미존재하는 이메일 입니다.',
+ POSSIBLEEMAIL = '사용가능한 이메일 입니다.',
+ DUPLICATENOTCHECK = '아이디 또는 이메일 중복체크를 해주세요.',
+ SIGNUPSUCCESS = '회원가입에 성공하셨습니다.',
+ SIGNINSUCCESS = '로그인에 성공하셨습니다.',
+ FINDPASSWORDSUCCESS = '패스워드 변경을 위한 주소를 이메일로 전송하였습니다.',
+ EMAILSECRETKEYSUCCESS = '이메일로 QR Code를 재발급 받을 수 있는 주소를 전송하였습니다.',
+ CHANGEPASSWORDSUCCESS = '비밀번호가 성공적으로 변경되었습니다.',
+ CONFIRMEMAILSUCCESS = '이메일 인증을 성공하셨습니다.',
+ FINDIDEMAILSEND = '등록된 이메일로 아이디를 전송하였습니다.',
+ AFTERQRREGISTER = '인증 이메일이 전송되었습니다. 인증을 진행해주세요.',
+}
diff --git a/WEB/FE/src/utils/verify.ts b/WEB/FE/src/utils/verify.ts
new file mode 100644
index 00000000..70c2083f
--- /dev/null
+++ b/WEB/FE/src/utils/verify.ts
@@ -0,0 +1,38 @@
+import { message } from './message';
+
+const ID_MIN_LENGTH = 8;
+const ID_MAX_LENGTH = 20;
+const PW_MIN_LENGTH = 8;
+const PW_MAX_LENGTH = 20;
+const WS_REGEX = /\s/;
+const NUM_REGEX = /[0-9]/gi;
+const ENG_REGEX = /[a-zA-Z]/gi;
+const SC_REGEX = /[`~!@#$%^&*|\\'";:/?]/gi;
+
+interface Form {
+ id: string;
+ password: string;
+ rePassword: string;
+ name: string;
+ birth: string;
+ email: string;
+ phone: string[];
+}
+
+export const verify = ({ id, password, rePassword, name, birth, email, phone }: Form): string => {
+ if (id.length < ID_MIN_LENGTH || id.length > ID_MAX_LENGTH || id.search(WS_REGEX) !== -1)
+ return message.IDNOTCONDITION;
+ if (
+ password.length < PW_MIN_LENGTH ||
+ password.length > PW_MAX_LENGTH ||
+ password.search(WS_REGEX) !== -1 ||
+ password.search(NUM_REGEX) < 0 ||
+ password.search(ENG_REGEX) < 0 ||
+ password.search(SC_REGEX) < 0
+ )
+ return message.PASSWORDNOTCONDITION;
+ if (password !== rePassword) return message.PASSWORDNOTACCORD;
+ if (!id || !password || !email || !name || !birth || phone.findIndex((elem) => elem === '') !== -1)
+ return message.SOMETHINGNOTINPUT;
+ return '1';
+};
diff --git a/WEB/FE/static/640px-SHAhmac.png b/WEB/FE/static/640px-SHAhmac.png
new file mode 100644
index 00000000..7e97f964
Binary files /dev/null and b/WEB/FE/static/640px-SHAhmac.png differ
diff --git a/WEB/FE/static/Dice.jpg b/WEB/FE/static/Dice.jpg
new file mode 100644
index 00000000..fe2a6f96
Binary files /dev/null and b/WEB/FE/static/Dice.jpg differ
diff --git a/WEB/FE/static/HMAC.svg b/WEB/FE/static/HMAC.svg
new file mode 100644
index 00000000..abe4c6ae
--- /dev/null
+++ b/WEB/FE/static/HMAC.svg
@@ -0,0 +1,122 @@
+
+
diff --git a/WEB/FE/static/OTP.svg b/WEB/FE/static/OTP.svg
new file mode 100644
index 00000000..966cf5b1
--- /dev/null
+++ b/WEB/FE/static/OTP.svg
@@ -0,0 +1,160 @@
+
+
diff --git a/WEB/FE/static/OTP_authenticatioin_registration.png b/WEB/FE/static/OTP_authenticatioin_registration.png
new file mode 100644
index 00000000..16c974b7
Binary files /dev/null and b/WEB/FE/static/OTP_authenticatioin_registration.png differ
diff --git a/WEB/FE/static/SecretKey.svg b/WEB/FE/static/SecretKey.svg
new file mode 100644
index 00000000..74d7ddb9
--- /dev/null
+++ b/WEB/FE/static/SecretKey.svg
@@ -0,0 +1,148 @@
+
+
diff --git a/WEB/FE/static/TOTPFrame.svg b/WEB/FE/static/TOTPFrame.svg
new file mode 100644
index 00000000..a350200c
--- /dev/null
+++ b/WEB/FE/static/TOTPFrame.svg
@@ -0,0 +1,300 @@
+
+
diff --git a/WEB/FE/static/TimeStamp.svg b/WEB/FE/static/TimeStamp.svg
new file mode 100644
index 00000000..98523d98
--- /dev/null
+++ b/WEB/FE/static/TimeStamp.svg
@@ -0,0 +1,128 @@
+
+
diff --git a/WEB/FE/static/Truncation.svg b/WEB/FE/static/Truncation.svg
new file mode 100644
index 00000000..7dd660c7
--- /dev/null
+++ b/WEB/FE/static/Truncation.svg
@@ -0,0 +1,151 @@
+
+
diff --git a/WEB/FE/static/favicon.ico b/WEB/FE/static/favicon.ico
new file mode 100644
index 00000000..c01160ec
Binary files /dev/null and b/WEB/FE/static/favicon.ico differ
diff --git a/WEB/FE/static/github.svg b/WEB/FE/static/github.svg
new file mode 100644
index 00000000..d9a232c7
--- /dev/null
+++ b/WEB/FE/static/github.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/static/index.html b/WEB/FE/static/index.html
new file mode 100644
index 00000000..c03b4825
--- /dev/null
+++ b/WEB/FE/static/index.html
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+ TOTP App
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/WEB/FE/static/john-tuesday-8c6iJMh80BI-unsplash.jpg b/WEB/FE/static/john-tuesday-8c6iJMh80BI-unsplash.jpg
new file mode 100644
index 00000000..7694cfd6
Binary files /dev/null and b/WEB/FE/static/john-tuesday-8c6iJMh80BI-unsplash.jpg differ
diff --git a/WEB/FE/static/logo.svg b/WEB/FE/static/logo.svg
new file mode 100644
index 00000000..1d40c0ed
--- /dev/null
+++ b/WEB/FE/static/logo.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/static/totp-diagram.png b/WEB/FE/static/totp-diagram.png
new file mode 100644
index 00000000..1d2cfd29
Binary files /dev/null and b/WEB/FE/static/totp-diagram.png differ
diff --git a/WEB/FE/static/undraw_mobile_web_2g8b.svg b/WEB/FE/static/undraw_mobile_web_2g8b.svg
new file mode 100644
index 00000000..9df7794d
--- /dev/null
+++ b/WEB/FE/static/undraw_mobile_web_2g8b.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/static/undraw_page_not_found_su7k.svg b/WEB/FE/static/undraw_page_not_found_su7k.svg
new file mode 100644
index 00000000..a418baf8
--- /dev/null
+++ b/WEB/FE/static/undraw_page_not_found_su7k.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/static/undraw_security_o890.svg b/WEB/FE/static/undraw_security_o890.svg
new file mode 100644
index 00000000..2bd37434
--- /dev/null
+++ b/WEB/FE/static/undraw_security_o890.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/static/undraw_two_factor_authentication_namy.svg b/WEB/FE/static/undraw_two_factor_authentication_namy.svg
new file mode 100644
index 00000000..c0192485
--- /dev/null
+++ b/WEB/FE/static/undraw_two_factor_authentication_namy.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/static/undraw_unlock_24mb.svg b/WEB/FE/static/undraw_unlock_24mb.svg
new file mode 100644
index 00000000..8ebe4768
--- /dev/null
+++ b/WEB/FE/static/undraw_unlock_24mb.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/WEB/FE/tsconfig.json b/WEB/FE/tsconfig.json
new file mode 100644
index 00000000..0d0195bd
--- /dev/null
+++ b/WEB/FE/tsconfig.json
@@ -0,0 +1,80 @@
+{
+ "compilerOptions": {
+ /* Basic Options */
+ // "incremental": true, /* Enable incremental compilation */
+ "target": "es5" /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */,
+ "module": "es2015" /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */,
+ // "lib": [], /* Specify library files to be included in the compilation. */
+ // "allowJs": true, /* Allow javascript files to be compiled. */
+ // "checkJs": true, /* Report errors in .js files. */
+ "jsx": "react" /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */,
+ "declaration": true, /* Generates corresponding '.d.ts' file. */
+ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
+ // "sourceMap": true /* Generates corresponding '.map' file. */,
+ // "outFile": "./", /* Concatenate and emit output to single file. */
+ "outDir": "./dist/" /* Redirect output structure to the directory. */,
+ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
+ // "composite": true, /* Enable project compilation */
+ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
+ // "removeComments": true, /* Do not emit comments to output. */
+ // "noEmit": true, /* Do not emit outputs. */
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
+
+ /* Strict Type-Checking Options */
+ "strict": true /* Enable all strict type-checking options. */,
+ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
+ // "strictNullChecks": true, /* Enable strict null checks. */
+ // "strictFunctionTypes": true, /* Enable strict checking of function types. */
+ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
+ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
+
+ /* Additional Checks */
+ // "noUnusedLocals": true, /* Report errors on unused locals. */
+ // "noUnusedParameters": true, /* Report errors on unused parameters. */
+ // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */
+ // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */
+
+ /* Module Resolution Options */
+ "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
+ "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
+ "typeRoots": ["./src/types", "./node_modules/@types"], /* List of folders to include type definitions from. */
+ // "types": [], /* Type declaration files to be included in compilation. */
+ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
+ "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */,
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
+
+ /* Source Map Options */
+ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
+ "inlineSourceMap": true /* Emit a single file with source maps instead of having a separate file. */,
+ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
+
+ /* Experimental Options */
+ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
+
+ /* Advanced Options */
+ "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */
+ "paths": {
+ "@/*": ["src/*"],
+ "@api/*": ["src/api/*"],
+ "@hooks/*": ["src/hooks/*"],
+ "@components/*": ["src/components/*"],
+ "@styles/*": ["src/styles/*"],
+ "@static/*": ["stc/static/*"],
+ "@utils/*": ["src/utils/*"],
+ "@types/*": ["src/types/*"],
+ "@layouts/*": ["src/layouts/*"],
+ "@pages/*": ["src/pages/*"],
+ }
+ },
+ "include": ["./src/**/*"],
+ "exclude": ["node_modules"],
+ "typeRoots": ["./src/types", "./node_modules/@types"]
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..76d0a131
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,243 @@
+{
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "@apidevtools/json-schema-ref-parser": {
+ "version": "9.0.6",
+ "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.6.tgz",
+ "integrity": "sha512-M3YgsLjI0lZxvrpeGVk9Ap032W6TPQkH6pRAZz81Ac3WUNF79VQooAFnp8umjvVzUmD93NkogxEwbSce7qMsUg==",
+ "requires": {
+ "@jsdevtools/ono": "^7.1.3",
+ "call-me-maybe": "^1.0.1",
+ "js-yaml": "^3.13.1"
+ }
+ },
+ "@apidevtools/openapi-schemas": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.0.4.tgz",
+ "integrity": "sha512-ob5c4UiaMYkb24pNhvfSABShAwpREvUGCkqjiz/BX9gKZ32y/S22M+ALIHftTAuv9KsFVSpVdIDzi9ZzFh5TCA=="
+ },
+ "@apidevtools/swagger-methods": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz",
+ "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg=="
+ },
+ "@apidevtools/swagger-parser": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz",
+ "integrity": "sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg==",
+ "requires": {
+ "@apidevtools/json-schema-ref-parser": "^9.0.6",
+ "@apidevtools/openapi-schemas": "^2.0.4",
+ "@apidevtools/swagger-methods": "^3.0.2",
+ "@jsdevtools/ono": "^7.1.3",
+ "call-me-maybe": "^1.0.1",
+ "z-schema": "^4.2.3"
+ }
+ },
+ "@jsdevtools/ono": {
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
+ "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg=="
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "call-me-maybe": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms="
+ },
+ "commander": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz",
+ "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q=="
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
+ },
+ "esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g=="
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "requires": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.0.4",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "requires": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "js-yaml": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
+ },
+ "lodash.isequal": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz",
+ "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA="
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "swagger-jsdoc": {
+ "version": "6.0.0-rc.3",
+ "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.0.0-rc.3.tgz",
+ "integrity": "sha512-hCcGVw9VW5xaxTY2LRpmKti/Kk59hHbepO5Nl1UlA/yPw5A8mWScaMJOJeC5Xu1dnj30LCI7iV8ie1YMFhu77Q==",
+ "requires": {
+ "commander": "6.2.0",
+ "doctrine": "3.0.0",
+ "glob": "7.1.6",
+ "swagger-parser": "10.0.2",
+ "yaml": "2.0.0-1"
+ }
+ },
+ "swagger-parser": {
+ "version": "10.0.2",
+ "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.2.tgz",
+ "integrity": "sha512-9jHkHM+QXyLGFLk1DkXBwV+4HyNm0Za3b8/zk/+mjr8jgOSiqm3FOTHBSDsBjtn9scdL+8eWcHdupp2NLM8tDw==",
+ "requires": {
+ "@apidevtools/swagger-parser": "10.0.2"
+ }
+ },
+ "swagger-ui-dist": {
+ "version": "3.37.2",
+ "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-3.37.2.tgz",
+ "integrity": "sha512-XIT4asxgeL4GUNPPsqpEqLt20M/u6OhFYqTh42IoEAvAyv5e9EGw5uhP9dLAD10opcMYqdkJ5qU+MpN2HZ5xyA=="
+ },
+ "swagger-ui-express": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-4.1.5.tgz",
+ "integrity": "sha512-hs9OqBu2jwmhYyFUhdTiwurvbZC+bq2XnWmmbYymVdwhgJCcGkLdnqymX24ZYUve2nkYSvKPEDCo20ZF+vyw9A==",
+ "requires": {
+ "swagger-ui-dist": "^3.18.1"
+ }
+ },
+ "validator": {
+ "version": "12.2.0",
+ "resolved": "https://registry.npmjs.org/validator/-/validator-12.2.0.tgz",
+ "integrity": "sha512-jJfE/DW6tIK1Ek8nCfNFqt8Wb3nzMoAbocBF6/Icgg1ZFSBpObdnwVY2jQj6qUqzhx5jc71fpvBWyLGO7Xl+nQ=="
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "yaml": {
+ "version": "2.0.0-1",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz",
+ "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ=="
+ },
+ "z-schema": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-4.2.3.tgz",
+ "integrity": "sha512-zkvK/9TC6p38IwcrbnT3ul9in1UX4cm1y/VZSs4GHKIiDCrlafc+YQBgQBUdDXLAoZHf2qvQ7gJJOo6yT1LH6A==",
+ "requires": {
+ "commander": "^2.7.1",
+ "lodash.get": "^4.4.2",
+ "lodash.isequal": "^4.5.0",
+ "validator": "^12.0.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "optional": true
+ }
+ }
+ }
+ }
+}