아이패드 크롬에서만 로그인이 안 돼요 — nginx, 로드밸런서, 그리고 사라진 https

"아이패드 크롬만 로그인이 안 돼요" — 특정 기기 버그 추적기와 Nginx 트랩

iOS 크롬과 HSTS 캐시, 그리고 Nginx absolute_redirect가 만들어낸 로드밸런서 HTTPS 다운그레이드 해결기

"갤럭시 탭 크롬은 되고요, 아이패드 사파리도 되는데, 아이패드 크롬만 로그인이 안 돼요."

운영하다 보면 이런 신고가 제일 골치 아픕니다. 특정 브라우저, 특정 기기에서만 재현되는 버그. 코드를 아무리 들여다봐도 "브라우저마다 다르게 동작할 이유"가 안 보이거든요. 이 글은 그 신고 한 건이 사실은 Nginx가 로드밸런서 뒤에서 HTTPS를 HTTP로 떨어뜨리던 고전적인 인프라 함정이었다는 걸 추적한 기록입니다.

1. 현상 파악: 골치 아픈 특정 환경 재현 버그

관리자 대시보드에서 다른 시스템으로 넘어가는 로그인 버튼이 있는데, 이게 특정 환경에서만 실패했습니다.

🔍 환경별 재현 결과:
  • 📱 아이패드 크롬: 실패 ❌
  • 📱 아이패드 사파리: 성공 ⭕
  • 🤖 갤럭시탭 크롬: 성공 ⭕
  • 💻 PC (모든 브라우저): 성공 ⭕

"크롬 문제다"라고 단정하기엔 갤럭시 크롬은 멀쩡합니다. "iOS 문제다"라고 하기엔 사파리는 됩니다. 딱 iOS × 크롬 교집합에서만 터지는 기괴한 상황이었습니다.

2. 로그 분석: 결정적 차이 (Referer)

증상이 아니라 데이터를 봅니다. 백엔드 Referer 검증 로그를 실패/성공 케이스로 나란히 놓으니 결정적 차이가 한 줄에 드러났습니다.

❌ 아이패드 크롬 (실패 로그)
referer: http://app.example.com/         ← http, 그리고 루트 경로
허용목록: ['https://admin.example.com/', 'https://app.example.com/']
→ referer 체크 후 리다이렉트 (301, 로그인 차단)
⭕ 아이패드 사파리 (성공 로그)
referer: https://app.example.com/        ← https, 정상 경로
→ 통과, 정상 로그인 진행

검증 코드는 단순했습니다. 허용 목록은 전부 https://로 시작하는데, 아이패드 크롬이 보낸 Referer는 http://였습니다.

즉, "크롬이 로그인을 못 한다"가 아니라 "크롬은 페이지를 HTTP로 보고 있다"가 진짜 문제였습니다.

3. 원인 파악: 프로토콜 다운그레이드와 HSTS

왜 크롬만 HTTP로 볼까? 로그인 직후 리다이렉트 체인을 한 줄씩 따라가니, 같은 301 응답 직후 두 브라우저가 갈라졌습니다.

  • 크롬: 리다이렉트 다음 요청의 Referer가 - (없음) ➡️ 이후 모든 요청 Referer가 http://app.example.com... (페이지 자체가 HTTP로 로딩됨)
  • 사파리: 같은 요청 Referer가 https://... 유지 ➡️ 끝까지 HTTPS 유지
💡 HTTPS ➡️ HTTP 다운그레이드 동작 원리
HTTPS에서 HTTP로 내려갈 때 브라우저는 보안상 Referer를 제거합니다. 크롬에서 Referer가 -로 찍힌 것은 그 지점에서 프로토콜이 다운그레이드됐다는 증거였습니다.

사파리·갤럭시 크롬은 **HSTS 자동 업그레이드**(HTTP를 HTTPS로 바꿔서 재요청)가 동작해 다운그레이드가 방지되었고, iOS 크롬은 독립된 HSTS 캐시 항목이 없어서 HTTP를 그대로 따라갔던 것입니다.

여기서 "지난주는 됐는데 이번주부터 안 된다"의 답도 나옵니다. 서버 코드는 변경되지 않았으나, 해당 기기의 HSTS 캐시 상태가 바뀐 것입니다. 캐시 삭제나 크롬 업데이트로 자동 업그레이드가 풀리면, 오래전부터 잠복해 있던 인프라 버그가 비로소 드러나게 됩니다.

4. 진짜 범인과 해결 방법: Nginx 절대 리다이렉트

로드밸런서(ALB 등) 뒤에 있는 Nginx가 리다이렉트 응답을 만들 때, 기본 설정상 클라이언트 요청의 스키마를 제대로 인지하지 못하면 Location: http://... 형태로 절대 경로를 조립해서 내보내는 것이 원인이었습니다.

🛠️ 해결법: absolute_redirect off; 설정
Nginx가 절대 URL을 조립하지 않도록 설정하면 Location 헤더가 상대 경로로 나가게 되어 프로토콜 다운그레이드를 방지할 수 있습니다.
http {
    absolute_redirect off;
    ...
}

해당 설정 적용 후, 아이패드 크롬에서도 HTTPS가 이탈 없이 정상 유지되며 로그인 문제가 해결되었습니다.

댓글

이 블로그의 인기 게시물

[문서] excel 체크박스 삭제

[DB] MySQL 백업 / 복원

[DB] MySQL 사용자(USER) 생성,삭제,권한부여 하기