안녕하세요.
외부의 API를 웹프로젝트 서버단에서 호출하여 결과값을 받아오고자 하는데요.
해당 API는 Postman, 콘솔프로젝트, curl로 호출할때는 정상적으로 200 결과값이 받아집니다.
딱 웹서버단에서 호출하면 403 forbidden 이 떨어지는데요. 이런 경우 무엇을 확인해 봐야 할까요?
처음엔 도메인이 달라서 브라우저 단에서 차단(CORS)되는건 아닌가 싶었는데 그건 클라이언트와 연관있
는 부분이라 제가 하려는건 서버단에서 호출이라 해당이 안되는 것 같습니다.
호출하려는 API는 GET 방식의 “http://api.eu.safenetid.com/api/v1/healthcheck” 주소이며
인증이나 다른 헤더 등을 포함하지 않아도 거의 호출 됩니다.
우선 제가 해본 코드 입니다.
CMD 창에서 CURL로 호출해본 결과 정상적으로 결과가 떨어집니다.
다음으로 리눅스에서도 CURL로 호출해본 결과
다음은 Postman에서 특별한 설정 없이 Method와 주소만 입력하고 날려본 결과 입니다.
다음은 Postman에서 생성해준 C# 코드로 콘솔에서 호출해서 날려본 결과입니다.
해당 콘솔의 코드 입니다.
using System;
using System.Net.Http;
using System.Threading.Tasks;
namespace ConsoleApp41
{
internal class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
CallApi().GetAwaiter().GetResult();
}
static async Task CallApi()
{
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get
, "http://api.eu.safenetid.com/api/v1/healthcheck");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
Console.WriteLine(await response.Content.ReadAsStringAsync());
}
}
}
asp.net core 3.1 API 프로젝트로 생성하여 동일 코드를 날리면 다음과 같이 403으로 오류가 납니다.
해당 코드 입니다.
using Microsoft.AspNetCore.Mvc;
using System.Net.Http;
using System.Threading.Tasks;
namespace WebApplication25.Controllers
{
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
[HttpGet]
public async Task<string> GetHC()
{
var client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get
, "http://api.eu.safenetid.com/api/v1/healthcheck");
var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
}
}
검색을 해보면 Header 값에 User-Agent 등을 설정해라. 뭐라 여러 건들이 나오는데 제가 궁금한건
Postman, Curl, 콘솔 프로젝트는 다 제대로 호출이 되는데 왜 웹서버 쪽에서만 호출하면 403이 발생하는지에 대한 의문입니다. 어떤 부분을 의심해 볼 수 있을지 고수님들의 조언 부탁드립니다.
질문 읽어주셔서 감사합니다.
해결 내용-------------------------------------------------------------------------------------------------------
문제는 asp.net core 3.1에서 403 Forbidden이 확인되었고 asp.net core 6.0에서는 문제가 없었습니다.
두 버전의 차이점을 확인하고자 burp suite를 통해 request를 잡아 내용을 확인한 결과 차이가 있었습니다.
asp.net 3.1
GET /api/v1/healthcheck HTTP/2
Host: api.eu.safenetid.com
Request-Id: |fa85aac-44305dc74956a676.
asp.net 6.0
GET /api/v1/healthcheck HTTP/2
Host: api.eu.safenetid.com
Traceparent: 00-186e08364a0e7409da9a2b72d1d8f2ef-592abf225052ace9-00
3.1과 6.0이 보내는 값이 약간 차이가 있더군요.
어떠한 헤더도 추가하지 않은 상태에서 Request-Id, Traceparent 등이 ASP.NET 에서 자체생성(?)하는 값인거 같은데요. 3.1에서의 Request-Id의 형식이 문제가 되는거 같습니다.
맨 앞의 | 와 끝의 . 이런것들에 의해 서버측 유효성에서 실패하는것으로 보여지네요.
Request-Id를 헤더에 임의로 생성해서 보내면 3.1에서도 정상으로 값이 나옵니다.
asp.net에서 결국 임의의 header등을 기본으로 추가하는거 같은데 이런 값들이 추가되지 않게 하는 옵션이 있지 않을까 싶습니다. 찾아봐야 겠네요.