From ba8eaffe8ba029986ccf32f69c87b834b60d58c8 Mon Sep 17 00:00:00 2001 From: ljh0608 Date: Wed, 4 Feb 2026 21:47:00 +0900 Subject: [PATCH 1/8] =?UTF-8?q?fix:=20=EB=94=A5=EB=A7=81=ED=81=AC=20?= =?UTF-8?q?=EC=A0=91=EA=B7=BC=20=EA=B6=8C=ED=95=9C=20=ED=97=88=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/index.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/api/index.ts b/src/api/index.ts index 7a43607b..a1b7e601 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -95,6 +95,10 @@ export const handleTokenError = async (error: AxiosError) => { // 개인정보 처리방침 페이지는 로그인 필요 없음, 구글 정책상 오픈 return Promise.reject(error); } + // 에스크 문자를 통한 딥링크 접근을 위해 허용 + if (window.location.pathname === '/.well-known/apple-app-site-association' || '/.well-known/assetlinks.json') { + return Promise.reject(error); + } /** 토큰이 없으면 refresh 시도하지 않고 바로 intro로 이동 */ const currentToken = tokenStorage.get(); if (currentToken === null && window.location.pathname !== '/intro') { From 929507700e391b6b85b6292995deee3df4e464ab Mon Sep 17 00:00:00 2001 From: ljh0608 Date: Sun, 8 Feb 2026 18:21:31 +0900 Subject: [PATCH 2/8] =?UTF-8?q?fix:=20ask=EC=A0=84=EC=9A=A9=20=EB=94=A5?= =?UTF-8?q?=EB=A7=81=ED=81=AC=20=EB=B0=B0=ED=8F=AC=20cloudflare=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/build.yml | 8 ++++- .../.well-known/apple-app-site-association.ts | 19 +++++++++++ functions/.well-known/assetlinks.json.ts | 20 +++++++++++ public/.well-known/apple-app-site-association | 33 ++++++++----------- 4 files changed, 59 insertions(+), 21 deletions(-) create mode 100644 functions/.well-known/apple-app-site-association.ts create mode 100644 functions/.well-known/assetlinks.json.ts diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6225c31a..db74ceec 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -41,9 +41,15 @@ jobs: - name: Build run: yarn build && yarn next export + - name: Prepare deployment package + run: | + mkdir -p deploy + cp -r out/* deploy/ + cp -r functions deploy/ + - uses: actions/upload-artifact@v4 with: name: built-app - path: out + path: deploy if-no-files-found: error retention-days: 7 diff --git a/functions/.well-known/apple-app-site-association.ts b/functions/.well-known/apple-app-site-association.ts new file mode 100644 index 00000000..8a6a4fdc --- /dev/null +++ b/functions/.well-known/apple-app-site-association.ts @@ -0,0 +1,19 @@ +const APPLE_APP_SITE_ASSOCIATION = `{ + "applinks": { + "apps": [], + "details": [ + { + "appID": "95YWTT5L8K.com.sopt-stamp-iOS.release", + "paths": ["*"] + } + ] + } +}`; + +export const onRequest: PagesFunction = () => { + return new Response(APPLE_APP_SITE_ASSOCIATION, { + headers: { + 'Content-Type': 'application/json', + }, + }); +}; diff --git a/functions/.well-known/assetlinks.json.ts b/functions/.well-known/assetlinks.json.ts new file mode 100644 index 00000000..2f97bd67 --- /dev/null +++ b/functions/.well-known/assetlinks.json.ts @@ -0,0 +1,20 @@ +const ASSETLINKS_JSON = `[ + { + "relation": ["delegate_permission/common.handle_all_urls"], + "target": { + "namespace": "android_app", + "package_name": "org.sopt.official", + "sha256_cert_fingerprints": [ + "29:23:1F:E3:7A:FD:76:9C:58:CA:F3:E2:D9:7C:A1:69:CF:04:A8:6E:5B:8A:C6:56:6A:6F:E8:FD:D8:FF:47:43" + ] + } + } +]`; + +export const onRequest: PagesFunction = () => { + return new Response(ASSETLINKS_JSON, { + headers: { + 'Content-Type': 'application/json', + }, + }); +}; diff --git a/public/.well-known/apple-app-site-association b/public/.well-known/apple-app-site-association index 0ccf0bd8..8d57ce1d 100644 --- a/public/.well-known/apple-app-site-association +++ b/public/.well-known/apple-app-site-association @@ -1,20 +1,13 @@ -{\rtf1\ansi\ansicpg1252\cocoartf2822 -\cocoatextscaling0\cocoaplatform0{\fonttbl\f0\froman\fcharset0 Times-Roman;} -{\colortbl;\red255\green255\blue255;\red0\green0\blue0;} -{\*\expandedcolortbl;;\cssrgb\c0\c0\c0;} -\paperw11900\paperh16840\margl1440\margr1440\vieww11520\viewh8400\viewkind0 -\deftab720 -\pard\pardeftab720\partightenfactor0 - -\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 -\{\ - \'93applinks\'94: \{\ - \'93apps\'94: [],\ - \'93details\'94: [\ - \{\ - \'93appID\'94: \'9395YWTT5L8K.com.sopt-stamp-iOS.release\'94,\ - \'93paths\'94: [\'93*\'94]\ - \}\ - ]\ - \}\ -\}} \ No newline at end of file +{ + "applinks": { + "apps": [], + "details": [ + { + "appID": "95YWTT5L8K.com.sopt-stamp-iOS.release", + "paths": [ + "*" + ] + } + ] + } +} From 8874b2526d64ef2905f3788887e02453388b9a84 Mon Sep 17 00:00:00 2001 From: ljh0608 Date: Mon, 9 Feb 2026 21:55:54 +0900 Subject: [PATCH 3/8] =?UTF-8?q?fix:=20=EC=95=88=EB=93=9C=EB=A1=9C=EC=9D=B4?= =?UTF-8?q?=EB=93=9C=20assetlinks=20=ED=8C=8C=EC=9D=BC=20=EB=82=B4?= =?UTF-8?q?=EC=9A=A9=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- functions/.well-known/assetlinks.json.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/functions/.well-known/assetlinks.json.ts b/functions/.well-known/assetlinks.json.ts index 2f97bd67..5bf7edac 100644 --- a/functions/.well-known/assetlinks.json.ts +++ b/functions/.well-known/assetlinks.json.ts @@ -5,7 +5,8 @@ const ASSETLINKS_JSON = `[ "namespace": "android_app", "package_name": "org.sopt.official", "sha256_cert_fingerprints": [ - "29:23:1F:E3:7A:FD:76:9C:58:CA:F3:E2:D9:7C:A1:69:CF:04:A8:6E:5B:8A:C6:56:6A:6F:E8:FD:D8:FF:47:43" + "29:23:1F:E3:7A:FD:76:9C:58:CA:F3:E2:D9:7C:A1:69:CF:04:A8:6E:5B:8A:C6:56:6A:6F:E8:FD:D8:FF:47:43", + "30:8A:35:1F:E1:88:94:6F:BC:E9:B2:D5:FC:2F:9B:F2:10:35:2A:43:B8:36:03:8B:C4:1B:EA:51:23:76:1C:00" ] } } From 38578cb47cf6de1f5b6f214c076eecfae6f477d5 Mon Sep 17 00:00:00 2001 From: ljh0608 Date: Mon, 9 Feb 2026 23:49:31 +0900 Subject: [PATCH 4/8] =?UTF-8?q?chore:=20env=20crew=20api=20url=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.development b/.env.development index 4ef5628e..33a0adc6 100644 --- a/.env.development +++ b/.env.development @@ -11,4 +11,4 @@ NEXT_PUBLIC_ADMIN_API_URL=https://api-dev.sopt.org/v2 NEXT_PUBLIC_ADMIN_API_KEY= NEXT_PUBLIC_OPERATION_API_URL=https://operation.api.dev.sopt.org NEXT_PUBLIC_AUTH_API_URL=https://auth.api.dev.sopt.org -NEXT_PUBLIC_CREW_API_URL=https://crew.api.dev.sopt.org \ No newline at end of file +NEXT_PUBLIC_CREW_API_URL=https://crew-api-dev.sopt.org/ \ No newline at end of file From 15589625bca9dc16285659fa24a32f5b19089296 Mon Sep 17 00:00:00 2001 From: ljh0608 Date: Mon, 9 Feb 2026 23:51:47 +0900 Subject: [PATCH 5/8] =?UTF-8?q?feat:=20=EB=A9=A4=EB=B2=84=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=B9=B4=EB=93=9C=20=EB=A9=94=EC=9D=B4?= =?UTF-8?q?=EC=BB=A4=EC=8A=A4=20=EA=B8=B0=EC=88=98=ED=91=9C=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/members/main/MemberList/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/members/main/MemberList/index.tsx b/src/components/members/main/MemberList/index.tsx index e840637b..d12fff1a 100644 --- a/src/components/members/main/MemberList/index.tsx +++ b/src/components/members/main/MemberList/index.tsx @@ -4,6 +4,7 @@ import { colors } from '@sopt-makers/colors'; import { fonts } from '@sopt-makers/fonts'; import { IconSwitchVertical } from '@sopt-makers/icons'; import { SearchField } from '@sopt-makers/ui'; +import { Spacing } from '@toss/emotion-utils'; import { debounce, uniq } from 'lodash-es'; import Link from 'next/link'; import { useRouter } from 'next/router'; @@ -45,7 +46,6 @@ import { useRunOnce } from '@/hooks/useRunOnce'; import IconDiagonalArrow from '@/public/icons/icon-diagonal-arrow.svg'; import { MB_BIG_MEDIA_QUERY } from '@/styles/mediaQuery'; import { MOBILE_MEDIA_QUERY } from '@/styles/mediaQuery'; -import { Spacing } from '@toss/emotion-utils'; const PAGE_LIMIT = 24; interface MemberListProps { @@ -492,7 +492,7 @@ const MemberList: FC = ({ banner }) => { const badges = sorted .filter((activity) => activity.generation && activity.part) .map((activity) => ({ - content: `${activity.generation}기 ${activity.part}`, + content: `${activity.generation}기 ${activity.team || activity.part}`, isActive: activity.generation === LATEST_GENERATION, })); From ae380e627d7a5fdc8a26832e5e1368adc16ab42e Mon Sep 17 00:00:00 2001 From: ljh0608 Date: Fri, 13 Feb 2026 16:42:04 +0900 Subject: [PATCH 6/8] =?UTF-8?q?fix:=20refresh=20=EC=9E=98=20=ED=98=B8?= =?UTF-8?q?=EC=B6=9C=EB=90=98=EB=8F=84=EB=A1=9D=20=EC=83=81=EC=9C=84=20?= =?UTF-8?q?=EC=A1=B0=EA=B1=B4=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/index.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/api/index.ts b/src/api/index.ts index a1b7e601..505514ae 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -80,6 +80,7 @@ axiosCrewInstance.interceptors.response.use( ); export const handleTokenError = async (error: AxiosError) => { + console.log(error); const originRequest = error.config; if (!error.response || !originRequest) throw new Error('에러가 발생했습니다.'); @@ -95,8 +96,8 @@ export const handleTokenError = async (error: AxiosError) => { // 개인정보 처리방침 페이지는 로그인 필요 없음, 구글 정책상 오픈 return Promise.reject(error); } - // 에스크 문자를 통한 딥링크 접근을 위해 허용 - if (window.location.pathname === '/.well-known/apple-app-site-association' || '/.well-known/assetlinks.json') { + // 앱 딥링크를 위한 .well-known 경로는 인증 체크 제외 + if (window.location.pathname.startsWith('/.well-known')) { return Promise.reject(error); } /** 토큰이 없으면 refresh 시도하지 않고 바로 intro로 이동 */ @@ -105,6 +106,7 @@ export const handleTokenError = async (error: AxiosError) => { window.location.replace('/intro'); throw new Error('토큰이 없습니다.'); } + try { const { data } = await axiosAuthInstance.post<{ data: { accessToken: string } }>( `/api/v1/auth/refresh/web`, From 4e968c01a02cb07661a149604c1883859c921b1b Mon Sep 17 00:00:00 2001 From: ljh0608 Date: Fri, 13 Feb 2026 16:42:29 +0900 Subject: [PATCH 7/8] =?UTF-8?q?chore:=20=ED=94=8C=EA=B7=B8api=20env=20?= =?UTF-8?q?=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.env.development b/.env.development index 33a0adc6..23900a2e 100644 --- a/.env.development +++ b/.env.development @@ -2,7 +2,7 @@ NEXT_PUBLIC_ORIGIN=http://localhost:3000 NEXT_PUBLIC_FACEBOOK_APP_ID= NEXT_PUBLIC_GOOGLE_OAUTH_CLIENT_ID=456944189609-jo13a6v8cb25vofi8qfldu3ionkq4u2q.apps.googleusercontent.com NEXT_PUBLIC_APPLE_OAUTH_APP_ID=com.sopt-playground.sopt-iOS -NEXT_PUBLIC_API_URL=https://playground.dev.sopt.org +NEXT_PUBLIC_API_URL=https://playground-dev.sopt.org NEXT_PUBLIC_DEBUG=true NEXT_PUBLIC_GTM_ID=GTM-KJHR376 NEXT_PUBLIC_AMPLITUDE_API_KEY= @@ -10,5 +10,5 @@ NEXT_PUBLIC_KAKAO_TALK_PLUGIN_KEY= NEXT_PUBLIC_ADMIN_API_URL=https://api-dev.sopt.org/v2 NEXT_PUBLIC_ADMIN_API_KEY= NEXT_PUBLIC_OPERATION_API_URL=https://operation.api.dev.sopt.org -NEXT_PUBLIC_AUTH_API_URL=https://auth.api.dev.sopt.org +NEXT_PUBLIC_AUTH_API_URL=https://auth-dev-api.sopt.org NEXT_PUBLIC_CREW_API_URL=https://crew-api-dev.sopt.org/ \ No newline at end of file From c16be069d64031f4771853c631342c319d2ff0fc Mon Sep 17 00:00:00 2001 From: ljh0608 Date: Fri, 13 Feb 2026 16:50:58 +0900 Subject: [PATCH 8/8] =?UTF-8?q?chore:=20console=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/api/index.ts b/src/api/index.ts index 505514ae..de8136ed 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -80,7 +80,6 @@ axiosCrewInstance.interceptors.response.use( ); export const handleTokenError = async (error: AxiosError) => { - console.log(error); const originRequest = error.config; if (!error.response || !originRequest) throw new Error('에러가 발생했습니다.');