1. 인터셉터란?
인터셉터(interceptor)는 주로 HTTP 통신을 처리할 때 사용되는 개념이다. 인터셉터는 네트워크 요청이나 응답을 가로채어 추가적인 처리를 할 수 있는 기능을 제공한다. 예를 들어, 모든 HTTP 요청에 공통적으로 헤더를 추가하거나, 응답을 받았을 때 특정 로직을 실행하고 싶을 때 인터셉터를 사용할 수 있다.
2. 인터셉터 적용 전
_core/config/http.dart
import 'package:dio/dio.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; // mac : ipconfig getifaddr en0 final dio = Dio( BaseOptions( baseUrl: "http://192.168.11.171:8080", // IPConfig 로 ip 확인하기⁷ contentType: "application/json; charset=utf-8", validateStatus: (status) => true, // 200 이 아니어도 예외 발생안하게 설정 ), ); const secureStorage = FlutterSecureStorage();
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252Ffe46d4d7-41b3-455e-82eb-d867ae41b8c1%252FUntitled.png%3Ftable%3Dblock%26id%3D06eb8b38-36b3-4b92-9a15-2032df15a4cc%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F018d16be-860b-4a7e-a00c-4d2d9a02fd08%252FUntitled.png%3Ftable%3Dblock%26id%3D168c9a1a-3cfa-4eab-8590-f990269d0f6c%26cache%3Dv2&w=3840&q=75)
인터셉터 적용 전은 매번 ViewModel 에서 세션에 접근해 토큰을 헤더에 넣어 통신을 해야 했다.
3. 인터셉터 적용 후
_core/config/http.dart
import 'package:dio/dio.dart'; import 'package:flutter_secure_storage/flutter_secure_storage.dart'; // mac : ipconfig getifaddr en0 final dio = Dio( BaseOptions( baseUrl: "http://192.168.11.171:8080", // IPConfig 로 ip 확인하기⁷ contentType: "application/json; charset=utf-8", validateStatus: (status) => true, // 200 이 아니어도 예외 발생안하게 설정 ), ); const secureStorage = FlutterSecureStorage(); // 인터셉터 생성 var interceptor = InterceptorsWrapper( onRequest: (options, handler) async { //토큰을 secureStorage에서 읽는다. var accessToken = await secureStorage.read(key: 'accessToken'); print("onRequest 토큰: $accessToken"); if (accessToken != null) { options.headers["Authorization"] = "Bearer $accessToken"; } else { print("나 토큰이 없어"); } return handler.next(options); }, onResponse: (response, handler) async { var authorizationHeader = response.headers["Authorization"]; if (authorizationHeader != null) { var accessToken = authorizationHeader[0].split("Bearer ")[1]; print("onResponse 토큰: " + accessToken); await secureStorage.write(key: "accessToken", value: accessToken); } return handler.next(response); }, onError: (error, handler) { //요청, 응답 오류일때 return handler.next(error); }, );
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F7c20d5d4-e66d-428c-9138-9f386426a751%252FUntitled.png%3Ftable%3Dblock%26id%3D299388fb-6af8-4bf2-9ec2-e1523823f434%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F404a9fb6-ab9b-45cc-8074-ee63a3334890%252F05238a22-2924-40ff-8543-399da5d7e55c%252FUntitled.png%3Ftable%3Dblock%26id%3D2c4bd22e-5e64-48c8-ac8b-e56f70576d92%26cache%3Dv2&w=3840&q=75)
매 코드에 토큰을 보내지 않아도 인터셉터가 자동으로 토큰을 포함해서 통신한다.
Share article