Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

기술 뉴스 #184 : 21-10-16

웹개발 관련

  • How to win at CORS : CORS가 생겨난 배경과 CORS가 어떻게 동작하는지 설명하는 글이다.(영어)

    • 크로스 프레임 스크립트는 오리진이 같은 경우에만 할 수 있도록 허용했다.(same-origin policy)
    • 같은 사이트여도 오리진은 다를 수 있는데 이는 public suffix list라는 프로젝트에서 관리하고 있다.
    • 다른 오리진에 HTTP 요청을 보내기 위해 W3C에서 CORS(Cross-Origin Resource Sharing)를 제안했다.
    • 크로스 오리진 요청은 Sec-Fetch-Mode 헤더와 함께 보내지므로 이를 통해 CORS 요청인지 아닌지 알 수 있다.
    • CORS가 아닌 HTML 요소에서도 crossorigin 속성을 사용해서 CORS 요청으로 바꿀 수 있다.
    • 요청이 어디서 왔는지 보여주기 위해 Origin이라는 새로운 헤더를 도입했다.
    • CORS 검사가 끝나면 CORS 응답은 Access-Control-Allow-Origin: * 헤더를 포함한다.
    • CORS는 credentials를 포함하지 않으므로 fecth()에서 credentials 옵션이나 HTML 요소에서 crossorigin="use-credentials"를 지정해서 크리덴셜을 포함할 수 있다.
    • 예외적인 요청을 보낼 때 브라우저는 preflight 요청을 먼저 보낸다. 메인 요청 전에 목적 URL에 OPTIONS로 보내는 요청이다.
    • CORS를 테스트할 수 있는 플레이그라운드를 제공한다.

그 밖의 개발 관련

  • ugit: DIY Git in Python : Python으로 직접 Git을 구현해 보는 튜토리얼로 단계별로 구현하면서 Git 내부가 어떻게 동작하는지 이해할 수 있다. 변경되는 Python 코드와 설명을 같이 보면서 따라 해 볼 수 있게 구성되어 있다.(영어)
  • API V2 전환과 DB 무중단 마이그레이션 후기 : 29CM에서 모노리스로 구성되어 있던 서버에서 서비스를 분리하면서 MySQL로 무중단 마이그레이션 하는 과정을 설명한 글이다.(한국어)

    • 좋아요 기능의 테이블 변경 작업을 하면서 v2 API를 별도의 서비스로 분리하기로 함
    • 기존 PostgreSQL을 MySQL로 전환하지만, v1, v2 API를 둘 다 제공해야 하므로 두 데이터베이스 간 데이터는 동기화되어야 함
    • 좋아요 설정/해제는 v1만 사용하도록 하고 SQS를 이용해서 이 데이터를 MySQL에 저장되게 한다.
    • 좋아요 조회는 v1과 v2를 모두 이용하게 했다.
    • 데이터 이관은 PostgreSQL을 덤프한 뒤 MySQL에 로드하게 했고 마이그레이션 중의 데이터는 SQS를 통해서 MySQL에 추가된다.
  • 배민쇼핑라이브를 만드는 기술: 채팅 편 : 배달의민족 쇼핑라이브에서 많을 때는 분당 2만 건이 넘는 메시지를 처리하기 위한 채팅을 직접 구현하기로 하면서 Redis의 Pub/Sub과 Webflux를 이용해서 채팅을 구현한 과정을 설명한다.

    • 이전에 구현했던 경험을 통해 WebSocket의 사용을 최소화해서 REST API를 사용할 수 있는 부분은 WebSocket의 커맨드를 이용하지 않도록 하여 WebSocket 처리에는 메시지를 보내고 받는 부분에 집중되도록 했다.
    • WebFlux로 non-blocking의 이점을 얻기 위해 대부분의 데이터는 Redis를 이용하고 RDB에 보관해야 하는 API는 별도로 분리했다.
    • WebSession을 사용했는데 어느 날 10,000개의 최대 세션 개수를 넘어서면서 오류가 발생하여 WebSession을 사용하지 않도록 개선했다.
    • 관리자 사이트에서 너무 많은 메시지를 브라우저에서 렌더링하다가 멈추는 문제가 발생하여 리스트를 가상화하고 렌더링 횟수를 줄여서 성능 문제를 해결하였다.
  • 또 depedency 버전을 잘못 설치하고 말았다. : 어느 환경에서나 의존성 관리는 어렵기 마련인데 npm이 의존성 관리에 이용하는 node_modules, package.json, package-lock.json의 개념과 이 각 파일의 존재 여부에 따라 의존성 설치가 어떻게 달라지는지 설명한다.(한국어)
  • A new public beta of GitHub Releases: How we’re improving the release experience : GitHub 릴리스의 새 기능이 퍼블릭 베타로 공개되었다. 릴리스 노트를 자동으로 생성할 수 있는 기능을 제공하고 UI에서 기여한 컨트리뷰터도 볼 수 있도록 개선되었다.(영어)
  • 내년 1월 31일부터 앱 내 계정 삭제 필수 : 2022년 1월 31일부터 App Store에 제출 모든 앱 내에서 계정을 삭제하는 기능을 제공해야 한다고 한다.(한국어)

인프라 관련

  • Understanding How Facebook Disappeared from the Internet : 지난 10월 5일 Facebook, Instagrm, Whatsapp이 5시간 정도 접속이 안 되는 장애가 발생했는데 이를 Cloudflare에서 분석 정리한 글이다. 이번 장에는 서버에 접속 안 된 것뿐 아니라 DNS 룩업도 안되고 인터넷에서 페이스북이 운영하는 모든 네트워크에 연결이 아예 되지 않았다. 서버에서 오류 응답을 받는 게 아니라 페이스북이 인터넷에서 사라진 상황이었다.(영어)

    • BGP(Border Gateway Protocol)은 인터넷의 AS(Autonomous Systems)가 라우팅 정보를 교환하는 프로토콜이다.
    • 페이스북의 발표에 따르면 페이스북이 백본 라우터를 조정하면서 데이터센터 백본이 끊어지면서 BGP 요청을 거부하고 DNS에서 접근이 불가능하게 되어버림.
  • Tools to explore BGP : 페이스북 장애와 관련해서 BGP 정보를 룩업할 수 있는 도구를 설명하는 글이다.(영어)

    • 자신의 ASN이 없으면 보통 BGP를 게시할 수 있는 권한이 없다.
    • AS(autonomous system)는 ISP, 정부, 대학, 페이스북 같은 조직에서 소유하고 있고 특정 IP 주소의 세트를 제어하며 식별 번호를 가지고 있다.
    • BGP를 게시해서 BGP 라우트로 해당 IP와 서브넷에 도달하는 경로를 알 수 있게 한다.
    • BGPView로 연결된 AS를 볼 수 있다.
    • traceroutemtr의 플래그를 통해서 어떤 AS를 거쳐 가는지 볼 수 있다.
    • PCH(packet clearing house) Looking Glass로 BGP 경로를 볼 수 있다.
    • BGPlay에서는 이전 시간의 BGP도 볼 수 있으므로 페이스북의 장애 시점에서 BGP 경로가 사라진 것도 볼 수 있다.
  • Connection Timeout과 Read Timeout 살펴보기 : Connection Timeout은 종단 간 연결하는데 필요한 최대 시간을 의미하므로 이 시간이 넘어가면 연결할 수 없다고 판단하고 오류가 발생한다. Read Timeout은 연결된 종단 간에 데이터를 주고받을 때 걸리는 최대시간이고 이 시간 내에 데이터를 다 받지 못하면 오류가 발생한다. 이를 바탕으로 연결할 때 SYN, SYN+ACK, ACK가 유실되는 경우를 생각하면 3초가 Connection Timeout으로 이상적인 값이고 Read Timeout은 패킷 유실과 요청 처리 시간을 고려해서 1초 정도로 제안하고 있다.
  • AWS Lambda battle 2021: performance comparison for all languages (cold and warm start) : AWS Lambda에서 Node.js, Python, Go, Ruby 등 다양한 런타임 간의 성능을 비교한 글이다. 콜드 스타트에 걸리는 시간과 JMeter로 15,000 요청을 보내면서 WARM 테스트를 수행해서 런타임 간의 요청 시간을 비교해 볼 수 있게 정리해 두었다.(영어)
  • Cilium joins the CNCF : eBPF 기반의 네트워킹 프로젝트인 cilium이 CNCF의 인큐베이팅 프로젝트로 들어갔다.(영어)

볼만한 링크

  • 페이스북 내부고발자 프랜시스 하우건 청문회 모두발언 전문 : WSJ를 통해 페이스북의 문제를 보도하게 했던 페이스북의 내부고발자 프랜시스 하우건이 미국 상원 청문회에서 한 모두 발언을 번역한 글이다. 프랜시스 하우건은 페이스북에서 가짜 뉴스를 막는 일을 했는데 페이스북은 항상 이윤을 추구해서 아이들에게 미치는 영향과 분열을 조장하는 메시지를 확산시키고 있다고 폭로했다. 이러한 큰 영향력이 있음에도 제지를 거의 받고 있지 않고 의회가 소셜미디어가 바뀌도록 해야 한다고 주장하고 있다. 꼭 한번 읽어볼 만한 글이라고 생각한다.(한국어)

IT 업계 뉴스

프로젝트

버전 업데이트

2021/10/16 20:44 2021/10/16 20:44