AI 도구 덕분에 코드를 만드는 속도는 극적으로 빨라졌다. v0.dev로 UI를 뽑고, Cursor로 로직을 채우고, Figma Make로 프로토타입을 던지면 하루 만에 동작하는 화면이 나온다. 문제는 그 속도가 때때로 '이건 나중에 봐도 되겠지'라는 착각과 함께 온다는 것이다. 그리고 보안은 정확히 그 '나중'에 무너진다.
Server Action은 private 함수가 아니다
"use server"를 붙이면 Next.js는 해당 함수를 /_next/action/{해시} 형태의 공개 POST 엔드포인트로 노출한다. 함수처럼 생겼지만 실제로는 네트워크를 통해 누구나 호출할 수 있는 API다. dev.to에 올라온 Ahmed Mahmoud의 실제 사례가 이를 잘 보여준다. 사용자 데이터 내보내기 기능을 Server Action으로 구현했는데, 세션 검증을 액션 내부에 넣지 않았다. 브라우저 콘솔만 열면 누구든 호출할 수 있었고, 3주 뒤에야 발견됐다.
AI가 생성한 Server Action 코드는 대체로 기능 구현에 집중되어 있다. 인증 검증, 권한 분기, Zod를 이용한 입력 유효성 검사, Rate Limiting—이 네 가지는 AI가 자동으로 챙겨주지 않는다. 지금 당장 프로젝트에서 "use server"를 검색해 노출된 함수 목록을 뽑아보자. 각 함수마다 세 가지를 확인해야 한다: 세션 검증이 액션 내부에 있는가, 클라이언트에서 넘어온 입력을 검증하는가, 인증(authentication)을 넘어 권한(authorization)까지 체크하는가.
반복 작업을 줄이는 좋은 패턴 하나는 requireAuth 래퍼를 만드는 것이다. 인증 검증을 함수 밖으로 위임함으로써 '까먹을 수 없는 구조'를 만드는 방식이다. Middleware 레벨에서 Upstash 같은 도구로 Rate Limiting을 추가하면, 엔드포인트 남용까지 막을 수 있다. AI가 빠르게 써준 코드를 프로덕션에 올리기 전, 이 점검 루틴은 사람이 직접 수행해야 한다.
JWT exp는 '초' 단위다—Date.now()와 1000배 차이 난다
JWT를 클라이언트에서 디코딩해 만료 여부를 체크하는 코드는 흔하다. 그리고 흔하게 틀린다. RFC 7519가 정의하는 exp는 Unix epoch 기준 초(second) 단위 NumericDate다. Date.now()는 밀리초를 반환한다. 이 둘을 그대로 비교하면 1710000000000 > 1710003600이 되어 모든 토큰이 즉시 만료된 것으로 처리된다. dev.to의 관련 아티클은 이 버그가 얼마나 조용하게, 그리고 광범위하게 퍼져 있는지 보여준다.
수정은 단순하다. exp * 1000과 Date.now()를 비교하거나, Math.floor(Date.now() / 1000)과 exp를 비교하면 된다. 여기에 클럭 스큐(clock skew) 보정으로 30초 정도 여유를 두면 경계값 처리도 안정적으로 된다. 그런데 더 중요한 포인트가 있다. 클라이언트에서 JWT를 디코딩하는 것은 읽는 행위지 신뢰하는 행위가 아니다. 서명 검증 없이 role: "admin"을 읽어서 관리자 UI를 렌더링하는 코드는, 누구나 페이로드를 조작한 토큰으로 우회할 수 있다. 권한 판단은 반드시 서버에서, 서명 검증 이후에 이루어져야 한다.
AI가 생성한 JWT 관련 코드에서 이 패턴은 자주 빠진다. 특히 '클라이언트에서 만료 체크 → 만료 시 리프레시 요청'이라는 흔한 플로우를 구현할 때, 단위 불일치가 조용히 스며든다. AI 코드 리뷰에서 exp와 Date.now()가 함께 등장하는 구간은 반드시 단위를 손으로 확인하는 습관을 들이자.
Figma Make + GPT-5.6: 더 빨라진 초안, 더 중요해진 검토
Figma가 공식 블로그를 통해 Figma Make에 GPT-5.6을 통합했다고 발표했다. 프롬프트 하나로 UI 샘플, 인터랙션 초안, 코드 변환까지 이어지는 파이프라인이 도구 안에 들어왔다. 디자인 나침반의 분석처럼, 초기 콘셉트 시각화와 반복 검증 주기가 눈에 띄게 짧아질 것이다. 디자인-개발 협업 흐름에서 AI가 차지하는 비중이 한 단계 높아지는 변화다.
그런데 여기서 같은 긴장이 다시 등장한다. AI가 만들어준 프로토타입은 빠르지만 '검증이 필요한 초안'이다. 자동 생성된 인터랙션이 실제 사용자 흐름과 맞는지, 코드로 변환된 컴포넌트가 접근성 기준을 충족하는지, 디자인 시스템 토큰이 일관되게 적용되었는지—이 판단은 여전히 사람의 몫이다. 속도가 올라갈수록 검토 게이트의 기준도 명확해야 한다.
빠른 실행과 안전한 경계, 둘 다 설계다
세 가지 사례는 하나의 패턴을 가리킨다. AI는 구현 속도를 올려주지만, 보안 경계와 정확성 검증은 설계 단계에서 사람이 명시해야 한다는 것. Server Action의 인증 래퍼, JWT 단위 일치, Figma 초안의 검토 기준—이것들은 AI가 채워주지 않는 빈칸이다.
앞으로 AI 도구의 성능이 높아질수록 이 빈칸이 더 잘 채워질 수도 있다. 하지만 지금 당장은, '빠르게 만들되 경계는 직접 설계한다'는 원칙이 실무 프론트엔드 개발자의 핵심 역량이다. 도구는 속도를 준다. 경계는 사람이 그린다.