Server Actions를 사용할 때 보안상 주의해야 할 점은 무엇인가요?
답변 포인트
서버에서 실행된다는 이유만으로 클라이언트 입력을 신뢰해도 되는지 생각해보세요.
정답 및 해설
빠른 요약
Server Actions는 클라이언트에서 호출할 수 있지만 서버에서 실행되는 함수입니다. 폼 처리나 mutation을 간결하게 만들 수 있지만, “서버 코드니까 안전하다”라고 착각하면 위험합니다.
Server Actions는 클라이언트에서 호출할 수 있지만 서버에서 실행되는 함수입니다. 폼 처리나 mutation을 간결하게 만들 수 있지만, “서버 코드니까 안전하다”라고 착각하면 위험합니다.
가장 중요한 원칙은 클라이언트 입력을 절대 신뢰하지 않는 것입니다. Action은 네트워크를 통해 호출될 수 있으므로 권한 검증, 입력 검증, CSRF 고려, rate limit이 필요합니다.
'use server';
export async function updateProfile(formData: FormData) {
const user = await requireUser();
const displayName = String(formData.get('displayName') ?? '').trim();
if (displayName.length < 2 || displayName.length > 30) {
throw new Error('잘못된 이름입니다.');
}
await db.user.update({
where: { id: user.id },
data: { displayName },
});
}또한 민감한 토큰이나 secret을 action의 반환값으로 보내면 안 됩니다. 서버에서 실행되더라도 반환 데이터는 클라이언트로 전달됩니다. 에러 메시지도 내부 SQL, stack trace, 권한 구조를 노출하지 않도록 정리해야 합니다.
Server Actions는 API route를 대체할 수 있는 편리한 도구지만, 결국 외부 입력을 받는 mutation endpoint라는 관점으로 다뤄야 합니다.