Coding Memo

Unity에서 UnityWebRequest 사용 시, 에러 (Curl error60) (localhost, loopback) 본문

Unity

Unity에서 UnityWebRequest 사용 시, 에러 (Curl error60) (localhost, loopback)

minttea25 2024. 7. 16. 14:36

Unity에서 UnityWebRequest를 통해, Https 연결을 요청할 때, 다음과 같은 에러가 발생 할 수 있다.

Curl error 60: Cert verify failed. Certificate Common Name(CN) does not match with the expected CN. UnityTls error code: 7

 

이 에러는 말그대로 Https 연결 시, 인증 문제로 나타나는 에러이다.

단순히 말해서, SSL 인증서 문제이다.

 

때때로, 이 에러는 자신의 컴퓨터의 루프백 주소(127.0.0.1)을 이용할 때 나타나기도 한다.

 

간단히 자신의 컴퓨터로 테스트를 해보고 싶은데 해당 에러가 뜬 다면, 다음 2가지 방법으로 해결 할 수 있다.


 

1. 루프백 주소(127.0.0.1) 대신, "localhost"를 사용

 

루프백 주소는 어쨋든간에, IP주소이라는 것을 다시 생각하면 이유가 명확해 질 수 있다. 루프백 주소는 결국, IP주소로 일반적으로 SSL 인증서의 CN이나 SAN에 포함되어 있지 않지만, "localhost"는 대부분의 SSL 인증서에 포함되어 있기 때문이라고 한다.

 

다시 말해서, IP주소인 " 127.0.0.1"은 인증서에 포함되어 있지 않을 것이지만, "localhost"는 말그대로 로컬 호스트로 인증서에 포함이 되어 있을 것이다.

(물론 이 내용은 자신의 컴퓨터에서 실행되는 웹서버에서 자동으로 self-signed 인증서를 생성했을 때의 이야기이다. 예를 들어, ASP.NET Core는 로컬 개발 시 자동으로 인증서를 생성하고 HTTPS를 지원하다고 한다.)


2. 인증서 검증 비활성화

 

이 방법은 말 그대로, 인증서에 대한 검증을 하지 않는 것이다. 반드시 true를 반환하여 검증 단계를 패스한다.

물론, 인증을 생략하는 코드이므로, 이는 개발환경에서만 사용하고, 배포시에는 해당 코드를 사용하면 안될 것이다.

 

아래는 예시 코드이다.

CertificateHandler를 상속하는 클래스를 생성하고, ValidateCertificate를 오버라이드한다.

    public class WebRequest : MonoBehaviour
    {
        public IEnumerator PostCo<T>(string url, T data, Action<UnityWebRequest.Result, string> callback)
        {
            string json = JsonUtility.ToJson(data);

            using (UnityWebRequest request = UnityWebRequest.Post(url, json))
            {
                byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(json);
                request.uploadHandler = new UploadHandlerRaw(bodyRaw);
                request.downloadHandler = new DownloadHandlerBuffer();
                // 핸들러 설정하여 항상 true를 반환하여 인증 통과
                request.certificateHandler = new FreeCertificate();
                request.SetRequestHeader("Content-Type", "application/json");
                yield return request.SendWebRequest();

                callback(request.result, request.downloadHandler.text);
            }
        }

    }

    class FreeCertificate : CertificateHandler
    {
        protected override bool ValidateCertificate(byte[] certificateData)
        {
            return true; // Always accept
        }
    }

웹 로그인을 테스트하는 과정에서, 루프백 주소를 이용하는 것과 localhost를 이용하는 것에는 차이가 없을 거라고 생각한 것이 문제였다. 이번 기회에 차이가있다는 것을 알게 되었고, 간단하게나마 인증서에 대해서 알게 되었고, 로컬 환경에서 테스트할 수 있는 방법까지 알게 되었다.

'Unity' 카테고리의 다른 글

UnityWebRequest.Post Memory Leak Error  (0) 2024.07.16
UnityWebRequest 코드  (0) 2024.07.16
Coroutine 실행 에러  (0) 2023.12.22
[AddressableAssets] SBP ErrorError  (0) 2023.09.06
SerializedObject  (1) 2023.05.12