소개
플러터는 크로스 플랫폼 모바일 애플리케이션 개발을 위한 프레임워크로, HTTP 통신을 위한 패키지는 많이 사용됩니다. 그 중에서도 http
패키지는 가장 많이 사용됩니다. 하지만, 개발 과정에서 서버와의 의존성을 최소화하고 테스트를 용이하게 하기 위해 가짜 응답을 반환하는 Mock API 서버를 사용하고자 할 때, http_mock_adapter
패키지를 사용할 수 있습니다. 하지만 이를 사용할 때 보안 이슈가 있을 수 있습니다. 이번 글에서는 이러한 보안 이슈를 어떻게 해결할 수 있는지 알아보겠습니다.
문제점
http_mock_adapter
패키지는 테스트를 위해 원래의 HTTP 클라이언트를 가로채고 실제 서버 대신 가짜 응답을 제공합니다. 하지만 이는 개발 중인 애플리케이션의 보안에 영향을 줄 수 있습니다. 만약 여러분이 애플리케이션에 중요한 보안 로직이 포함되어 있다면, Mock API 서버를 사용하는 것은 적절하지 않을 수 있습니다.
보안 이슈 해결 방법
-
중요한 보안 로직은 실제 서버에서 테스트해라
Mock API 서버는 개발 과정에서 의존성을 최소화하는 데 도움을 주지만, 중요한 보안 로직은 반드시 실제 서버에서 테스트해야합니다. Mock API 서버는 단지 기능 테스트나 개발 초기 단계에서 사용될 수 있도록 제한적으로 사용하는 것이 좋습니다. -
모의 응답을 사용하는 경우 HTTPS로 통신하라
Mock API 서버를 사용할 때는 HTTPS를 사용하여 통신하는 것이 안전합니다. HTTP 통신은 보안에 취약하므로 HTTPS를 이용하여 모의 응답을 주고받는 것이 좋습니다. -
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 응답을 제공합니다.
이처럼 모의 응답을 설정하고 검증하는 방법을 사용하여 보안 이슈를 최소화할 수 있습니다.