[flutter] 플러터 애플리케이션에서의 http_mock_adapter 사용 시 보안 이슈 해결 방법

소개

플러터는 크로스 플랫폼 모바일 애플리케이션 개발을 위한 프레임워크로, HTTP 통신을 위한 패키지는 많이 사용됩니다. 그 중에서도 http 패키지는 가장 많이 사용됩니다. 하지만, 개발 과정에서 서버와의 의존성을 최소화하고 테스트를 용이하게 하기 위해 가짜 응답을 반환하는 Mock API 서버를 사용하고자 할 때, http_mock_adapter 패키지를 사용할 수 있습니다. 하지만 이를 사용할 때 보안 이슈가 있을 수 있습니다. 이번 글에서는 이러한 보안 이슈를 어떻게 해결할 수 있는지 알아보겠습니다.

문제점

http_mock_adapter 패키지는 테스트를 위해 원래의 HTTP 클라이언트를 가로채고 실제 서버 대신 가짜 응답을 제공합니다. 하지만 이는 개발 중인 애플리케이션의 보안에 영향을 줄 수 있습니다. 만약 여러분이 애플리케이션에 중요한 보안 로직이 포함되어 있다면, Mock API 서버를 사용하는 것은 적절하지 않을 수 있습니다.

보안 이슈 해결 방법

  1. 중요한 보안 로직은 실제 서버에서 테스트해라
    Mock API 서버는 개발 과정에서 의존성을 최소화하는 데 도움을 주지만, 중요한 보안 로직은 반드시 실제 서버에서 테스트해야합니다. Mock API 서버는 단지 기능 테스트나 개발 초기 단계에서 사용될 수 있도록 제한적으로 사용하는 것이 좋습니다.

  2. 모의 응답을 사용하는 경우 HTTPS로 통신하라
    Mock API 서버를 사용할 때는 HTTPS를 사용하여 통신하는 것이 안전합니다. HTTP 통신은 보안에 취약하므로 HTTPS를 이용하여 모의 응답을 주고받는 것이 좋습니다.

  3. API 요청 및 응답을 검증하라
    Mock API 서버를 사용하는 경우, 응답을 검증하여 제대로 동작하는지 확인해야합니다. 또한, 요청을 보낼 때도 유효성 검사를 수행하고 필요에 따라 보안 헤더를 추가해야합니다.

예를 들어, 아래는 http_mock_adapter 패키지를 사용하여 Mock API 서버를 구축하고 검증하는 방법의 예시입니다.

import 'package:flutter_test/flutter_test.dart';
import 'package:http/http.dart' as http;
import 'package:http_mock_adapter/http_mock_adapter.dart';

void main() {
  group('MyHttpService', () {
    final mockAdapter = MockAdapter();
    final httpClient = http.Client();

    setUp(() {
      // Mock API 서버 설정
      httpClient.adapter = mockAdapter;

      // Mock 응답 설정
      mockAdapter.onGet('/api/foo').reply(200, {'message': 'Mocked response'});

      // 실제 서버 요청 및 응답을 허용하지 않기 위해 기본 응답 설정
      mockAdapter.onAny().reply(403, {'message': 'Forbidden'});
    });

    test('should return mocked response with status code 200', () async {
      final response = await httpClient.get(Uri.parse('/api/foo'));

      expect(response.statusCode, 200);
      expect(response.body, '{"message": "Mocked response"}');
    });

    test('should return default response with status code 403', () async {
      final response = await httpClient.get(Uri.parse('/api/bar'));

      expect(response.statusCode, 403);
      expect(response.body, '{"message": "Forbidden"}');
    });

    tearDown(() {
      // Mock API 서버 정리
      httpClient.close();
    });
  });
}

위 코드에서 mockAdapter.onGet('/api/foo').reply(200, {'message': 'Mocked response'}) 코드는 /api/foo 엔드포인트 호출에 대한 가짜 응답을 설정합니다.

또한, mockAdapter.onAny().reply(403, {'message': 'Forbidden'}) 코드는 모든 요청에 대해 기본적으로 403 Forbidden 응답을 제공합니다.

이처럼 모의 응답을 설정하고 검증하는 방법을 사용하여 보안 이슈를 최소화할 수 있습니다.

참고 자료