이 글 작성자임

TL;DR
- fingerprintjs 로 지문을 만들어서 나를 식별하길래 어떻게 하면 저 과정을 우회할 수 있을까 고민
- fingerprintjs 지문생성 과정자체를 nodejs 상에서 모사해볼까 하다가 빠른 시도 및 실패를 위해 일단 뒤로 미룸
  - 구현해야 할 다른 기능들이 마무리되면 이쪽도 파 볼 예정
- 차선책으로 headless browser 로 밀어버리는걸로 시도
  - 처음엔 puppeteer 사용
  - 그러나 이마저도 식별당하는걸 확인 후 playwright 로 대체
- network transaction 들을 확인하며 매번 새로운 지문을 발급받고 그 지문을 credential 로 잘 사용하는거 확인 후 해당 기능 개발 일단락

---

핵심은 별 거 없긴 한데...

- 그럴듯한 user-agent pool 을 만들어서 랜덤으로 하나 뽑아 사용
  - 해당 user-agent 에 맞는 적절한 headless browser 사용(chromium 이나 webkit 을 동적으로 변경)
- 기본적으로 오가는 고정적인 header 는 공통적으로 정리하여  header 를 최대한 완벽하게 모사
- 봇에서 요청하는 게 아니라 사람이 사이트를 탐색하는 것처럼 사이트 이동 + 관련 header 들 적절히 그에 맞춰 수정 (re!ferer 같은 것들)

---

하면서 깨달은 점

- 테스트 코드는 필요한 것 정돈 짜자, 없으니 개발 기간이 배로 걸리고 배포할때 사람 손으로 확인이 필요하다
  - 그리고 이걸 해야 cicd pipeline 태우는게 가능하다

- docker 로 runtime 추상화 하자, 일부 라이브러리같은 경우 로컬(맥, arm)에선 잘 됐는데 서버(우분투, arm)에선 안 되는 경우가 있었다
  - 오라클에서 공짜로 주는 ec2 를 쓰는 중이라 그냥 손배포 했는데 그냥 도커를 설치하고 컨테이너로 말아버릴까 생각중이다

- polling 은 rxjs 같은거 써서 reactive 하게 하자. 코드가 훨씬 깔끔해진다
  - 여담인데 장기적으론 event driven 한 architecture 로 가고 싶다

- 좋은 logging, 좋은 error handling 은 항상 어렵다
  - 회사 다닐땐 elasticsearch 로 만든 logging platform 에 metric 들을 실어보냈는데, 그런 넉넉한 자원이 없는 상황에서의 적정기술로서의 logging 이라 더 어려운 거 같다

- 좋은 function/method, 좋은 class, 좋은 component 짜는거부터 다시 연습하자

- 짜잘한 질문들 chatgpt 에게 해봤는데 쓸만한 결과를 던져준다, 내가 한 번 더 그걸 다듬어야 한다지만 자연언어 - 프로그래밍언어 사이의 추상화 계층이 하나 더 생긴듯핰 느낌이었다

---

저렇게 구성한 방식대로 5분 +_ 2~3분 사이의 임의의 시간마다 재 요청을 하고, persistence layer interface 를 구성하여 db~cache 사이의 무언가를 비스무레하게 만든 뒤에 저장

그리고 정보를 달라는 요청이 들어오면 그 저장한 값을 반환

이런식으로 마무리를 할 예정임