diff --git a/.env b/.env index c7a4f91..f12d2d9 100644 --- a/.env +++ b/.env @@ -5,6 +5,8 @@ # See the documentation for all the connection string options: https://pris.ly/d/connection-strings DATABASE_URL="mysql://root:@localhost:3306/test" +CORS_ALLOW_LIST = ['http://localhost:8080'] + JWT_SECURITY_KEY = "security_key" JWT_EXPIRE_MAX = "600s" AUTH_USERNAME_FIELD="email" diff --git a/package-lock.json b/package-lock.json index 3cc3e69..4752537 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@nestjs/passport": "^9.0.0", "@nestjs/platform-express": "^9.0.0", "@prisma/client": "^4.1.1", + "cors": "^2.8.5", "passport": "^0.6.0", "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", @@ -1786,7 +1787,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.1.1.tgz", "integrity": "sha512-DCw8L/SS0IXqmj5IW/fMxOXiifnsfjBzDfRhf0j3NFWqvMCh9OtfjmXQZxVgI2mwvJLc/5jzXhkiWT39qS09dA==", - "devOptional": true, + "dev": true, "hasInstallScript": true }, "node_modules/@prisma/engines-version": { @@ -6855,7 +6856,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.1.1.tgz", "integrity": "sha512-yw50J8If2dKP4wYIi695zthsCASQFHiogGvUHHWd3falx/rpsD6Sb1LMLRV9nO3iGG3lozxNJ2PSINxK7xwdpg==", - "devOptional": true, + "dev": true, "hasInstallScript": true, "dependencies": { "@prisma/engines": "4.1.1" @@ -8321,54 +8322,6 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "node_modules/webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, "node_modules/webpack-node-externals": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", @@ -9797,8 +9750,7 @@ "@nestjs/passport": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-9.0.0.tgz", - "integrity": "sha512-Gnh8n1wzFPOLSS/94X1sUP4IRAoXTgG4odl7/AO5h+uwscEGXxJFercrZfqdAwkWhqkKWbsntM3j5mRy/6ZQDA==", - "requires": {} + "integrity": "sha512-Gnh8n1wzFPOLSS/94X1sUP4IRAoXTgG4odl7/AO5h+uwscEGXxJFercrZfqdAwkWhqkKWbsntM3j5mRy/6ZQDA==" }, "@nestjs/platform-express": { "version": "9.0.8", @@ -9893,7 +9845,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.1.1.tgz", "integrity": "sha512-DCw8L/SS0IXqmj5IW/fMxOXiifnsfjBzDfRhf0j3NFWqvMCh9OtfjmXQZxVgI2mwvJLc/5jzXhkiWT39qS09dA==", - "devOptional": true + "dev": true }, "@prisma/engines-version": { "version": "4.1.0-48.8d8414deb360336e4698a65aa45a1fbaf1ce13d8", @@ -10524,15 +10476,13 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "8.2.0", @@ -11465,8 +11415,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-prettier": { "version": "4.2.1", @@ -12683,8 +12632,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "28.0.2", @@ -13773,7 +13721,7 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.1.1.tgz", "integrity": "sha512-yw50J8If2dKP4wYIi695zthsCASQFHiogGvUHHWd3falx/rpsD6Sb1LMLRV9nO3iGG3lozxNJ2PSINxK7xwdpg==", - "devOptional": true, + "dev": true, "requires": { "@prisma/engines": "4.1.1" } @@ -14049,8 +13997,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -14833,39 +14780,6 @@ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" }, - "webpack": { - "version": "5.74.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz", - "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==", - "dev": true, - "peer": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - } - }, "webpack-node-externals": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/webpack-node-externals/-/webpack-node-externals-3.0.0.tgz", diff --git a/package.json b/package.json index bb61e33..5f87da7 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@nestjs/passport": "^9.0.0", "@nestjs/platform-express": "^9.0.0", "@prisma/client": "^4.1.1", + "cors": "^2.8.5", "passport": "^0.6.0", "passport-jwt": "^4.0.0", "passport-local": "^1.0.0", diff --git a/src/main.ts b/src/main.ts index 4628033..6842c23 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,11 +1,30 @@ //참고 : https://wikidocs.net/book/7059 -import { NestFactory } from '@nestjs/core'; -import { AppModule } from './app.module'; - +import { NestFactory } from '@nestjs/core' +import { env } from 'process' +import { AppModule } from './app.module' +var cors = require('cors') async function bootstrap() { - const app = await NestFactory.create(AppModule); - await app.listen(3000); + const app = await NestFactory.create(AppModule) + //Enable All CORS Requests : https://github.com/expressjs/cors#enable-cors-for-a-single-route + var corsOptions = function (req, callback) { + const origin = req.header('Origin') + var corsOptions + if (env.CORS_ALLOW_LIST.indexOf(origin) !== -1) { + corsOptions = { origin: true } // reflect (enable) the requested origin in the CORS response + console.log('Allowed Origin URL: ' + origin) + } else { + corsOptions = { origin: false } // disable CORS for this request + console.log('Not Allowed Origin URL: ' + origin) + } + callback(null, corsOptions) // callback expects two parameters: error and options + } + app.use(cors(corsOptions)) + await app.listen(3000, function () { + console.log( + '[CORS-enabled->npm install -g webpack webpack-cli] web server listening on port 3000' + ) + }) } -bootstrap(); +bootstrap()