diff --git a/src/components/login-form.tsx b/src/components/login-form.tsx
index 104389e11cb487ab0b683400861bd6d7ddcf09a1..095c6d1be21f904a1cb7407b8b76a54ae2527929 100644
--- a/src/components/login-form.tsx
+++ b/src/components/login-form.tsx
@@ -1,5 +1,6 @@
 import React from 'react';
 import { useNavigate } from 'react-router';
+import { LoaderCircle } from 'lucide-react';
 import { cn } from '@/lib/utils';
 import { useAuthStore } from '@/stores/authStore';
 import { toast } from 'sonner';
@@ -11,9 +12,12 @@ import { Label } from '@/components/ui/label';
 export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRef<'div'>) {
   const { login } = useAuthStore();
   const navigate = useNavigate();
+  const [isLoading, setIsLoading] = React.useState(false);
 
   const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {
     e.preventDefault();
+    setIsLoading(true);
+
     const formData = new FormData(e.currentTarget);
     const username = formData.get('username') as string;
     const password = formData.get('password') as string;
@@ -25,6 +29,8 @@ export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRe
       console.error(err);
       toast.error('로그인에 실패했습니다');
     }
+
+    setIsLoading(false);
   };
 
   return (
@@ -45,7 +51,8 @@ export function LoginForm({ className, ...props }: React.ComponentPropsWithoutRe
                 <Label htmlFor="password">비밀번호</Label>
                 <Input id="password" name="password" type="password" placeholder="비밀번호" required />
               </div>
-              <Button type="submit" className="w-full">
+              <Button type="submit" className="w-full" disabled={isLoading}>
+                {isLoading && <LoaderCircle className="animate-spin" />}
                 로그인
               </Button>
             </div>
diff --git a/src/pages/forwarding/Create.tsx b/src/pages/forwarding/Create.tsx
index 7c44fcb619fc1e58e08ea5cf24c1ab917d422459..c6d1e050f3249c047d40c9f784b12a2be19db929 100644
--- a/src/pages/forwarding/Create.tsx
+++ b/src/pages/forwarding/Create.tsx
@@ -2,6 +2,7 @@ import { z } from 'zod';
 import { zodResolver } from '@hookform/resolvers/zod';
 import { Link, useNavigate } from 'react-router';
 import { useForm } from 'react-hook-form';
+import { LoaderCircle } from 'lucide-react';
 import { Button } from '@/components/ui/button';
 import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
 import { Input } from '@/components/ui/input';
@@ -145,7 +146,10 @@ export default function ForwardingCreate() {
             <Button variant="outline" asChild>
               <Link to="..">취소</Link>
             </Button>
-            <Button type="submit">저장</Button>
+            <Button type="submit" disabled={form.formState.isSubmitting}>
+              {form.formState.isSubmitting && <LoaderCircle className="animate-spin" />}
+              저장
+            </Button>
           </div>
         </form>
       </Form>
diff --git a/src/pages/forwarding/Edit.tsx b/src/pages/forwarding/Edit.tsx
index 265ebf68669d3c22246f82e62180e37a4eca0326..c15dc944e01303c0f5dd2a59e43848afc0b71ddf 100644
--- a/src/pages/forwarding/Edit.tsx
+++ b/src/pages/forwarding/Edit.tsx
@@ -4,6 +4,7 @@ import { zodResolver } from '@hookform/resolvers/zod';
 import { Link, useNavigate, useParams } from 'react-router';
 import { useForm } from 'react-hook-form';
 import { toast } from 'sonner';
+import { LoaderCircle } from 'lucide-react';
 import { Skeleton } from '@/components/ui/skeleton';
 import { Button } from '@/components/ui/button';
 import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
@@ -169,7 +170,10 @@ export default function ForwardingEdit() {
             <Button variant="outline" asChild>
               <Link to="..">취소</Link>
             </Button>
-            <Button type="submit">저장</Button>
+            <Button type="submit" disabled={form.formState.isSubmitting}>
+              {form.formState.isSubmitting && <LoaderCircle className="animate-spin" />}
+              저장
+            </Button>
           </div>
         </form>
       </Form>
diff --git a/src/pages/routing/Create.tsx b/src/pages/routing/Create.tsx
index 44150f9a1ab363dc60530e6f3a193622e18d84fa..5934b08a1612876ca9807d9e6461af5e28051075 100644
--- a/src/pages/routing/Create.tsx
+++ b/src/pages/routing/Create.tsx
@@ -1,7 +1,7 @@
 import { useEffect, useState } from 'react';
 import { Link, useNavigate } from 'react-router';
 import { useForm, useWatch } from 'react-hook-form';
-import { Check, X } from 'lucide-react';
+import { Check, LoaderCircle, X } from 'lucide-react';
 import { z } from 'zod';
 import { zodResolver } from '@hookform/resolvers/zod';
 import { toast } from 'sonner';
@@ -286,7 +286,10 @@ export default function RoutingCreate() {
             <Button variant="outline" asChild>
               <Link to="..">취소</Link>
             </Button>
-            <Button type="submit">저장</Button>
+            <Button type="submit" disabled={form.formState.isSubmitting}>
+              {form.formState.isSubmitting && <LoaderCircle className="animate-spin" />}
+              저장
+            </Button>
           </div>
         </form>
       </Form>
diff --git a/src/pages/routing/Edit.tsx b/src/pages/routing/Edit.tsx
index 65169366d24bf5f7bcf1840d4ea47b1952efcf4e..108b6d85c55a719fa2a3d0a888ba54bef54e11c1 100644
--- a/src/pages/routing/Edit.tsx
+++ b/src/pages/routing/Edit.tsx
@@ -1,7 +1,7 @@
 import { useEffect, useRef, useState } from 'react';
 import { Link, useNavigate, useParams } from 'react-router';
 import { useForm, useWatch } from 'react-hook-form';
-import { Check, X } from 'lucide-react';
+import { Check, LoaderCircle, X } from 'lucide-react';
 import { z } from 'zod';
 import { zodResolver } from '@hookform/resolvers/zod';
 import { toast } from 'sonner';
@@ -107,7 +107,7 @@ export default function RoutingEdit() {
         console.error(error);
         toast.error('라우팅 설정 정보를 조회할 수 없습니다.');
       });
-  }, []);
+  }, [id]);
 
   useEffect(() => {
     if (enableSSL) {
@@ -346,7 +346,10 @@ export default function RoutingEdit() {
             <Button variant="outline" asChild>
               <Link to="..">취소</Link>
             </Button>
-            <Button type="submit">저장</Button>
+            <Button type="submit" disabled={form.formState.isSubmitting}>
+              {form.formState.isSubmitting && <LoaderCircle className="animate-spin" />}
+              저장
+            </Button>
           </div>
         </form>
       </Form>