diff --git a/package-lock.json b/package-lock.json index 9585851..27be6fc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,30 +15,24 @@ "@nestjs/core": "^10.0.0", "@nestjs/jwt": "^10.1.1", "@nestjs/mongoose": "^10.0.1", - "@nestjs/passport": "^10.0.2", "@nestjs/platform-express": "^10.0.0", "@nestjs/platform-socket.io": "^10.2.5", "@nestjs/schedule": "^4.0.0", "@nestjs/swagger": "^7.1.10", "@nestjs/typeorm": "^10.0.0", "@nestjs/websockets": "^10.2.5", - "@types/passport-jwt": "^3.0.12", "aws-sdk": "^2.1443.0", "axios": "^1.5.1", "chalk": "^5.3.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "config": "^3.3.9", + "cookie-parser": "^1.4.6", "dotenv": "^16.3.1", "mongoose": "^7.5.0", "mysql2": "^3.6.0", "nest-aws-sdk": "^3.0.1", "nestjs-asyncapi": "^1.2.1", - "passport": "^0.6.0", - "passport-google-oauth20": "^2.0.0", - "passport-jwt": "^4.0.1", - "passport-kakao": "^1.0.1", - "passport-naver-v2": "^2.0.8", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "socket.io-client": "^4.7.2", @@ -50,11 +44,11 @@ "@nestjs/schematics": "^10.0.2", "@nestjs/testing": "^10.0.0", "@types/config": "^3.3.2", + "@types/cookie-parser": "^1.4.6", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", "@types/multer": "^1.4.9", "@types/node": "^20.3.1", - "@types/passport-naver": "^1.0.1", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", @@ -4481,15 +4475,6 @@ "rxjs": "^7.0.0" } }, - "node_modules/@nestjs/passport": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/@nestjs/passport/-/passport-10.0.2.tgz", - "integrity": "sha512-od31vfB2z3y05IDB5dWSbCGE2+pAf2k2WCBinNuTTOxN0O0+wtO1L3kawj/aCW3YR9uxsTOVbTDwtwgpNNsnjQ==", - "peerDependencies": { - "@nestjs/common": "^8.0.0 || ^9.0.0 || ^10.0.0", - "passport": "^0.4.0 || ^0.5.0 || ^0.6.0" - } - }, "node_modules/@nestjs/platform-express": { "version": "10.2.7", "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-10.2.7.tgz", @@ -6148,6 +6133,7 @@ "version": "1.19.4", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.4.tgz", "integrity": "sha512-N7UDG0/xiPQa2D/XrVJXjkWbpqHCd2sBaB32ggRF2l83RhPfamgKGF8gwwqyksS95qUS5ZYF9aF+lLPRlwI2UA==", + "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -6163,6 +6149,7 @@ "version": "3.4.37", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.37.tgz", "integrity": "sha512-zBUSRqkfZ59OcwXon4HVxhx5oWCJmc0OtBTK05M+p0dYjgN6iTwIL2T/WbsQZrEsdnwaF9cWQ+azOnpPvIqY3Q==", + "dev": true, "dependencies": { "@types/node": "*" } @@ -6172,6 +6159,15 @@ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" }, + "node_modules/@types/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-KoooCrD56qlLskXPLGUiJxOMnv5l/8m7cQD2OxJ73NPMhuSz9PmvwRD6EpjDyKBVrdJDdQ4bQK7JFNHnNmax0w==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/cookiejar": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.3.tgz", @@ -6231,6 +6227,7 @@ "version": "4.17.20", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.20.tgz", "integrity": "sha512-rOaqlkgEvOW495xErXMsmyX3WKBInbhG5eqojXYi3cGUaLoRDlXa5d52fkfWZT963AZ3v2eZ4MbKE6WpDAGVsw==", + "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -6242,6 +6239,7 @@ "version": "4.17.39", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.39.tgz", "integrity": "sha512-BiEUfAiGCOllomsRAZOiMFP7LAnrifHpt56pc4Z7l9K6ACyN06Ns1JLMBxwkfLOjJRlSf06NwWsT7yzfpaVpyQ==", + "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -6261,7 +6259,8 @@ "node_modules/@types/http-errors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.3.tgz", - "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==" + "integrity": "sha512-pP0P/9BnCj1OVvQR2lF41EkDG/lWWnDyA203b/4Fmi2eTyORnBtcDoKDwjWQthELrBvWkMOrvSOnZ8OVlW6tXA==", + "dev": true }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.5", @@ -6318,7 +6317,8 @@ "node_modules/@types/mime": { "version": "1.3.4", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.4.tgz", - "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==" + "integrity": "sha512-1Gjee59G25MrQGk8bsNvC6fxNiRgUlGn2wlhGf95a59DrprnnHk80FIMMFG9XHMdrfsuA119ht06QPDXA1Z7tw==", + "dev": true }, "node_modules/@types/multer": { "version": "1.4.9", @@ -6343,43 +6343,6 @@ "integrity": "sha512-3YmXzzPAdOTVljVMkTMBdBEvlOLg2cDQaDhnnhT3nT9uDbnJzjWhKlzb+desT12Y7tGqaN6d+AbozcKzyL36Ng==", "dev": true }, - "node_modules/@types/passport": { - "version": "1.0.14", - "resolved": "https://registry.npmjs.org/@types/passport/-/passport-1.0.14.tgz", - "integrity": "sha512-D6p2ygR2S7Cq5PO7iUaEIQu/5WrM0tONu6Lxgk0C9r3lafQIlVpWCo3V/KI9To3OqHBxcfQaOeK+8AvwW5RYmw==", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/passport-jwt": { - "version": "3.0.12", - "resolved": "https://registry.npmjs.org/@types/passport-jwt/-/passport-jwt-3.0.12.tgz", - "integrity": "sha512-nXCd1lu20rw//nZ5AnK1FnlVZdSC4R5xksquev9oAJlXwJw0irMdZ7dRAE4KDlalptKObiaoam6BQ8lpujeZog==", - "dependencies": { - "@types/express": "*", - "@types/jsonwebtoken": "*", - "@types/passport-strategy": "*" - } - }, - "node_modules/@types/passport-naver": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/passport-naver/-/passport-naver-1.0.3.tgz", - "integrity": "sha512-n3OK5KfkKXEN42QVfyW5kPQXyt/ca9DZ+gAeMKR9UBiBEDk7Pahv+OxadwyHbJKSyOjmaJD2YDDEigkPZGJBzQ==", - "dev": true, - "dependencies": { - "@types/express": "*", - "@types/passport": "*" - } - }, - "node_modules/@types/passport-strategy": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/@types/passport-strategy/-/passport-strategy-0.2.37.tgz", - "integrity": "sha512-ltgwLnwHVfpjK7/66lpv43hiz90nIVb36JmeB0iF3FAZoHX6+LbkY5Ey97Bm8Jr0uGhQyDFEsSOOfejp5PJehg==", - "dependencies": { - "@types/express": "*", - "@types/passport": "*" - } - }, "node_modules/@types/protocol-buffers-schema": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/@types/protocol-buffers-schema/-/protocol-buffers-schema-3.4.2.tgz", @@ -6391,12 +6354,14 @@ "node_modules/@types/qs": { "version": "6.9.9", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.9.tgz", - "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==" + "integrity": "sha512-wYLxw35euwqGvTDx6zfY1vokBFnsK0HNrzc6xNHchxfO2hpuRg74GbkEW7e3sSmPvj0TjCDT1VCa6OtHXnubsg==", + "dev": true }, "node_modules/@types/range-parser": { "version": "1.2.6", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.6.tgz", - "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==" + "integrity": "sha512-+0autS93xyXizIYiyL02FCY8N+KkKPhILhcUSA276HxzreZ16kl+cmwvV2qAM/PuCCwPXzOXOWhiPcw20uSFcA==", + "dev": true }, "node_modules/@types/semver": { "version": "7.5.4", @@ -6408,6 +6373,7 @@ "version": "0.17.3", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.3.tgz", "integrity": "sha512-/7fKxvKUoETxjFUsuFlPB9YndePpxxRAOfGC/yJdc9kTjTeP5kRCTzfnE8kPUKCeyiyIZu0YQ76s50hCedI1ug==", + "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -6417,6 +6383,7 @@ "version": "1.15.4", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.4.tgz", "integrity": "sha512-aqqNfs1XTF0HDrFdlY//+SGUxmdSUbjeRXb5iaZc3x0/vMbYmdw9qvOgHWOyyLFxSSRnUuP5+724zBgfw8/WAw==", + "dev": true, "dependencies": { "@types/http-errors": "*", "@types/mime": "*", @@ -7532,14 +7499,6 @@ "node": "^4.5.0 || >= 5.9" } }, - "node_modules/base64url": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/base64url/-/base64url-3.0.1.tgz", - "integrity": "sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", @@ -8535,6 +8494,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -14677,11 +14656,6 @@ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" }, - "node_modules/oauth": { - "version": "0.9.15", - "resolved": "https://registry.npmjs.org/oauth/-/oauth-0.9.15.tgz", - "integrity": "sha512-a5ERWK1kh38ExDEfoO6qUHJb32rd7aYmPHuyCu3Fta/cnICvYmgd2uhuKXvPD+PXB+gCEYYEaQdIRAjCOwAKNA==" - }, "node_modules/oauth-sign": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", @@ -15101,100 +15075,6 @@ "node": ">= 0.8" } }, - "node_modules/passport": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", - "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", - "dependencies": { - "passport-strategy": "1.x.x", - "pause": "0.0.1", - "utils-merge": "^1.0.1" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-google-oauth20": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/passport-google-oauth20/-/passport-google-oauth20-2.0.0.tgz", - "integrity": "sha512-KSk6IJ15RoxuGq7D1UKK/8qKhNfzbLeLrG3gkLZ7p4A6DBCcv7xpyQwuXtWdpyR0+E0mwkpjY1VfPOhxQrKzdQ==", - "dependencies": { - "passport-oauth2": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-jwt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/passport-jwt/-/passport-jwt-4.0.1.tgz", - "integrity": "sha512-UCKMDYhNuGOBE9/9Ycuoyh7vP6jpeTp/+sfMJl7nLff/t6dps+iaeE0hhNkKN8/HZHcJ7lCdOyDxHdDoxoSvdQ==", - "dependencies": { - "jsonwebtoken": "^9.0.0", - "passport-strategy": "^1.0.0" - } - }, - "node_modules/passport-kakao": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/passport-kakao/-/passport-kakao-1.0.1.tgz", - "integrity": "sha512-uItaYRVrTHL6iGPMnMZvPa/O1GrAdh/V6EMjOHcFlQcVroZ9wgG7BZ5PonMNJCxfHQ3L2QVNRnzhKWUzSsumbw==", - "dependencies": { - "passport-oauth2": "~1.1.2", - "pkginfo": "~0.3.0" - } - }, - "node_modules/passport-kakao/node_modules/passport-oauth2": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.1.2.tgz", - "integrity": "sha512-wpsGtJDHHQUjyc9WcV9FFB0bphFExpmKtzkQrxpH1vnSr6RcWa3ZEGHx/zGKAh2PN7Po9TKYB1fJeOiIBspNPA==", - "dependencies": { - "oauth": "0.9.x", - "passport-strategy": "1.x.x", - "uid2": "0.0.x" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/passport-naver-v2": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/passport-naver-v2/-/passport-naver-v2-2.0.8.tgz", - "integrity": "sha512-CA0u+aA4K4Zf5e3dSd47agOS69ULOdBGei7CZY2BN1cEbLnhnc6OalFPvnXLuEKT8I4IuGwvh3EBZCST2FoI+A==", - "dependencies": { - "passport-oauth2": "^1.5.0" - } - }, - "node_modules/passport-oauth2": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/passport-oauth2/-/passport-oauth2-1.7.0.tgz", - "integrity": "sha512-j2gf34szdTF2Onw3+76alNnaAExlUmHvkc7cL+cmaS5NzHzDP/BvFHJruueQ9XAeNOdpI+CH+PWid8RA7KCwAQ==", - "dependencies": { - "base64url": "3.x.x", - "oauth": "0.9.x", - "passport-strategy": "1.x.x", - "uid2": "0.0.x", - "utils-merge": "1.x.x" - }, - "engines": { - "node": ">= 0.4.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/jaredhanson" - } - }, - "node_modules/passport-strategy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/passport-strategy/-/passport-strategy-1.0.0.tgz", - "integrity": "sha512-CB97UUvDKJde2V0KDWWB3lyf6PC3FaZP7YxZ2G8OAtn9p4HI9j9JLP9qjOGZFvyl8uwNT8qM+hGnz/n16NI7oA==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -15264,11 +15144,6 @@ "node": ">=8" } }, - "node_modules/pause": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", - "integrity": "sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==" - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -15363,14 +15238,6 @@ "node": ">=8" } }, - "node_modules/pkginfo": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/pkginfo/-/pkginfo-0.3.1.tgz", - "integrity": "sha512-yO5feByMzAp96LtP58wvPKSbaKAi/1C4kV9XpTctr6EepnP6F33RBNOiVrdz9BrPA98U2BMFsTNHo44TWcbQ2A==", - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/pluralize": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", @@ -18239,11 +18106,6 @@ "node": ">=8" } }, - "node_modules/uid2": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.4.tgz", - "integrity": "sha512-IevTus0SbGwQzYh3+fRsAMTVVPOoIVufzacXcHPmdlle1jUpq7BRL+mw3dgeLanvGZdwwbWhRV6XrcFNdBmjWA==" - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", diff --git a/package.json b/package.json index 4f54025..3185174 100644 --- a/package.json +++ b/package.json @@ -26,30 +26,24 @@ "@nestjs/core": "^10.0.0", "@nestjs/jwt": "^10.1.1", "@nestjs/mongoose": "^10.0.1", - "@nestjs/passport": "^10.0.2", "@nestjs/platform-express": "^10.0.0", "@nestjs/platform-socket.io": "^10.2.5", "@nestjs/schedule": "^4.0.0", "@nestjs/swagger": "^7.1.10", "@nestjs/typeorm": "^10.0.0", "@nestjs/websockets": "^10.2.5", - "@types/passport-jwt": "^3.0.12", "aws-sdk": "^2.1443.0", "axios": "^1.5.1", "chalk": "^5.3.0", "class-transformer": "^0.5.1", "class-validator": "^0.14.0", "config": "^3.3.9", + "cookie-parser": "^1.4.6", "dotenv": "^16.3.1", "mongoose": "^7.5.0", "mysql2": "^3.6.0", "nest-aws-sdk": "^3.0.1", "nestjs-asyncapi": "^1.2.1", - "passport": "^0.6.0", - "passport-google-oauth20": "^2.0.0", - "passport-jwt": "^4.0.1", - "passport-kakao": "^1.0.1", - "passport-naver-v2": "^2.0.8", "reflect-metadata": "^0.1.13", "rxjs": "^7.8.1", "socket.io-client": "^4.7.2", @@ -61,11 +55,11 @@ "@nestjs/schematics": "^10.0.2", "@nestjs/testing": "^10.0.0", "@types/config": "^3.3.2", + "@types/cookie-parser": "^1.4.6", "@types/express": "^4.17.17", "@types/jest": "^29.5.2", "@types/multer": "^1.4.9", "@types/node": "^20.3.1", - "@types/passport-naver": "^1.0.1", "@types/supertest": "^2.0.12", "@typescript-eslint/eslint-plugin": "^6.0.0", "@typescript-eslint/parser": "^6.0.0", diff --git a/src/auth/controllers/auth.controller.ts b/src/auth/controllers/auth.controller.ts index 6a648a8..d6e522b 100644 --- a/src/auth/controllers/auth.controller.ts +++ b/src/auth/controllers/auth.controller.ts @@ -11,7 +11,7 @@ import { } from '@nestjs/common'; import { S3Service } from 'src/common/s3/s3.service'; import { TokenService } from '../services/token.service'; -import { ApiTags } from '@nestjs/swagger'; +import { ApiCookieAuth, ApiTags } from '@nestjs/swagger'; import { ApiNaverLogin } from '../swagger-decorators/naver-login.decorator'; import { ApiKakaoLogin } from '../swagger-decorators/kakao-login.decorator'; import { ApiNewAccessToken } from '../swagger-decorators/new-access-token.decorator'; @@ -29,8 +29,8 @@ import { GetUserId } from 'src/common/decorators/get-userId.decorator'; export class AuthController { constructor( private readonly authService: AuthService, - private tokenService: TokenService, - private s3Service: S3Service, + private readonly tokenService: TokenService, + private readonly s3Service: S3Service, ) {} @ApiNaverLogin() @@ -52,7 +52,13 @@ export class AuthController { naverRefreshToken, ); - return res.json({ accessToken, refreshToken }); + res.cookie('refresh_token', refreshToken, { + httpOnly: true, + secure: true, + maxAge: 1000 * 60 * 60 * 24 * 7, // 7일 + }); + + return res.json({ accessToken }); } @ApiKakaoLogin() @@ -74,9 +80,16 @@ export class AuthController { kakaoRefreshToken, ); - return res.json({ accessToken, refreshToken }); + res.cookie('refresh_token', refreshToken, { + httpOnly: true, + secure: true, + maxAge: 1000 * 60 * 60 * 24 * 7, // 7일 + }); + + return res.json({ accessToken }); } + @ApiCookieAuth('refresh-token') @ApiNewAccessToken() @UseGuards(JwtRefreshTokenGuard) @Get('new-access-token') diff --git a/src/auth/swagger-decorators/kakao-login.decorator.ts b/src/auth/swagger-decorators/kakao-login.decorator.ts index 780e64a..1595a7b 100644 --- a/src/auth/swagger-decorators/kakao-login.decorator.ts +++ b/src/auth/swagger-decorators/kakao-login.decorator.ts @@ -9,7 +9,7 @@ export function ApiKakaoLogin() { }), ApiResponse({ status: 200, - description: '성공적으로 로그인 된 경우', + description: '성공적으로 로그인 된 경우 (refresh_token은 쿠키로 전달됨)', content: { JSON: { example: { diff --git a/src/auth/swagger-decorators/naver-login.decorator.ts b/src/auth/swagger-decorators/naver-login.decorator.ts index a841c78..77a894b 100644 --- a/src/auth/swagger-decorators/naver-login.decorator.ts +++ b/src/auth/swagger-decorators/naver-login.decorator.ts @@ -1,5 +1,10 @@ import { applyDecorators } from '@nestjs/common'; -import { ApiOperation, ApiQuery, ApiResponse } from '@nestjs/swagger'; +import { + ApiHeader, + ApiOperation, + ApiQuery, + ApiResponse, +} from '@nestjs/swagger'; export function ApiNaverLogin() { return applyDecorators( @@ -9,12 +14,11 @@ export function ApiNaverLogin() { }), ApiResponse({ status: 200, - description: '성공적으로 로그인 된 경우', + description: '성공적으로 로그인 된 경우 (refresh_token은 쿠키로 전달됨)', content: { JSON: { example: { accessToken: '여기에 액세스 토큰', - refreshToken: '여기에 리프레시 토큰', }, }, }, diff --git a/src/auth/swagger-decorators/new-access-token.decorator.ts b/src/auth/swagger-decorators/new-access-token.decorator.ts index 033f859..7f0681e 100644 --- a/src/auth/swagger-decorators/new-access-token.decorator.ts +++ b/src/auth/swagger-decorators/new-access-token.decorator.ts @@ -1,5 +1,5 @@ import { applyDecorators } from '@nestjs/common'; -import { ApiHeaders, ApiOperation, ApiResponse } from '@nestjs/swagger'; +import { ApiOperation, ApiResponse } from '@nestjs/swagger'; export function ApiNewAccessToken() { return applyDecorators( @@ -49,13 +49,5 @@ export function ApiNewAccessToken() { }, }, }), - ApiHeaders([ - { - name: 'refresh_token', - description: '리프레시 토큰', - required: true, - example: '여기에 리프레시 토큰', - }, - ]), ); } diff --git a/src/config/guards/jwt-refresh-token.guard.ts b/src/config/guards/jwt-refresh-token.guard.ts index 111d7e0..161097e 100644 --- a/src/config/guards/jwt-refresh-token.guard.ts +++ b/src/config/guards/jwt-refresh-token.guard.ts @@ -1,15 +1,13 @@ -import { ExecutionContext, Injectable } from "@nestjs/common"; -import { TokenService } from "src/auth/services/token.service"; +import { ExecutionContext, Injectable } from '@nestjs/common'; +import { TokenService } from 'src/auth/services/token.service'; @Injectable() export class JwtRefreshTokenGuard { - constructor( - private tokenService: TokenService, - ) {} + constructor(private tokenService: TokenService) {} async canActivate(context: ExecutionContext) { const request = context.switchToHttp().getRequest(); - const refreshToken = request.headers['refresh_token']; + const refreshToken = request.cookies['refresh_token']; if (!refreshToken) { return false; @@ -20,4 +18,4 @@ export class JwtRefreshTokenGuard { return true; } -} \ No newline at end of file +} diff --git a/src/config/swagger.ts b/src/config/swagger.ts index efbb92f..f83f038 100644 --- a/src/config/swagger.ts +++ b/src/config/swagger.ts @@ -6,8 +6,27 @@ export function setupSwagger(app: INestApplication): void { .setTitle('ma6-main API') .setDescription('모던애자일 6기 메인프로젝트 API 문서') .setVersion('1.0') - .addCookieAuth('connect.sid') - .addBearerAuth({ type: 'http', scheme: 'bearer', bearerFormat: 'JWT', name: 'JWT', description: '여기에 토큰 입력', in: 'header' }, 'access-token') + .addBearerAuth( + { + type: 'http', + scheme: 'bearer', + bearerFormat: 'JWT', + name: 'JWT', + description: '여기에 토큰 입력', + in: 'header', + }, + 'access-token', + ) + .addCookieAuth( + 'refreshToken-cookie', + { + type: 'http', + in: 'Header', + scheme: 'Bearer', + description: '여기에 토큰 입력', + }, + 'refresh-token', + ) .build(); const document = SwaggerModule.createDocument(app, config); SwaggerModule.setup('swagger', app, document); diff --git a/src/main.ts b/src/main.ts index 3424eca..fdcfd18 100644 --- a/src/main.ts +++ b/src/main.ts @@ -3,6 +3,7 @@ import { AppModule } from './app.module'; import { Logger, ValidationPipe } from '@nestjs/common'; import { setupSwagger } from './config/swagger'; import { AsyncApiDocumentBuilder, AsyncApiModule } from 'nestjs-asyncapi'; +import * as cookieParser from 'cookie-parser'; async function bootstrap() { const app = await NestFactory.create(AppModule, { cors: true }); @@ -10,6 +11,7 @@ async function bootstrap() { app.useGlobalPipes(new ValidationPipe()); // app.useGlobalFilters(new HttpExceptionFilter()); app.enableCors(); + app.use(cookieParser()); setupSwagger(app); const asyncApiOptions = new AsyncApiDocumentBuilder() .setTitle('ma6-main-asyncapi')