В чем разница между Backend и Frontend разработкой?

«В чем разница между Backend и Frontend разработкой?» — вопрос из категории Архитектура, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Frontend (клиентская часть) и Backend (серверная часть) — два основных слоя веб-приложения, разделяющие ответственность за представление данных и бизнес-логику.

Frontend (клиент):

  • Выполняется в браузере пользователя
  • Технологии: HTML, CSS, JavaScript (React, Vue, Angular)
  • Ответственность:
    • Пользовательский интерфейс (UI) и опыт (UX)
    • Валидация ввода на стороне клиента
    • Адаптивная верстка для разных устройств
    • Взаимодействие с DOM

Backend (сервер):

  • Выполняется на сервере
  • Технологии: Node.js, Python (Django/Flask), Java (Spring), PHP, Ruby on Rails
  • Ответственность:
    • Бизнес-логика и обработка данных
    • Работа с базами данных (SQL/NoSQL)
    • Аутентификация и авторизация
    • API endpoints для фронтенда
    • Безопасность и валидация данных

Пример взаимодействия (авторизация пользователя):

1. Frontend (React):

// Компонент формы входа
function LoginForm() {
  const [credentials, setCredentials] = useState({email: '', password: ''});

  const handleSubmit = async (e) => {
    e.preventDefault();

    // Отправка запроса на бэкенд
    const response = await fetch('/api/login', {
      method: 'POST',
      headers: {'Content-Type': 'application/json'},
      body: JSON.stringify(credentials),
      credentials: 'include'  // Для cookies/sessions
    });

    if (response.ok) {
      // Перенаправление на защищенную страницу
      window.location.href = '/dashboard';
    } else {
      // Показать ошибку пользователю
      alert('Неверные учетные данные');
    }
  };

  return (
    <form onSubmit={handleSubmit}>
      <input type="email" onChange={e => setCredentials({...credentials, email: e.target.value})} />
      <input type="password" onChange={e => setCredentials({...credentials, password: e.target.value})} />
      <button type="submit">Войти</button>
    </form>
  );
}

2. Backend (Node.js + Express):

const express = require('express');
const app = express();
app.use(express.json());

// Endpoint для авторизации
app.post('/api/login', async (req, res) => {
  const { email, password } = req.body;

  // 1. Валидация входных данных
  if (!email || !password) {
    return res.status(400).json({ error: 'Email и пароль обязательны' });
  }

  // 2. Проверка в базе данных
  const user = await db.users.findOne({ email });
  if (!user) {
    return res.status(401).json({ error: 'Пользователь не найден' });
  }

  // 3. Проверка пароля (хешированного)
  const isValidPassword = await bcrypt.compare(password, user.passwordHash);
  if (!isValidPassword) {
    return res.status(401).json({ error: 'Неверный пароль' });
  }

  // 4. Создание сессии/JWT токена
  const token = jwt.sign(
    { userId: user.id, email: user.email },
    process.env.JWT_SECRET,
    { expiresIn: '24h' }
  );

  // 5. Отправка успешного ответа
  res.json({ 
    success: true, 
    token,
    user: { id: user.id, name: user.name, email: user.email }
  });
});

app.listen(3000, () => console.log('Backend запущен на порту 3000'));

Full-stack разработчики работают с обеими частями, но в крупных проектах обычно есть разделение на фронтенд и бэкенд команды.