깊은바다거북
개발 공부 기록
깊은바다거북
전체 방문자
오늘
어제
  • 분류 전체보기 (219)
    • JAVA (9)
    • JavaScript (15)
    • 스파르타코딩클럽 (11)
      • [내일배움단] 웹개발 종합반 개발일지 (5)
      • [내일배움캠프] 프로젝트와 트러블 슈팅 (6)
    • SQL | NoSQL (4)
    • CS 등등 (0)
    • TIL | WIL (173)
    • 기타 에러 해결 (3)
    • 내 살 길 궁리 (4)

인기 글

최근 글

최근 댓글

태그

  • 트러블 슈팅 Troubleshooting
  • 최대 힙(Max Heap)
  • TypeScript
  • Trie
  • Leetcode
  • 프로그래머스
  • leetcode-cli
  • POST / GET 요청
  • 01. 미니 프로젝트
  • Preorder Traversal(전위 순회)
  • Linked List
  • Til
  • Binary Tree(이진 트리)
  • Inorder Traversal(중위 순회)
  • Backtracking(백트래킹)
  • BFS(너비우선탐색)
  • 자료 구조
  • 재귀 함수
  • 팀 프로젝트
  • 점화식(Recurrence Relation)
  • 코딩테스트 연습문제
  • BST(이진 탐색 트리)
  • 자바스크립트 기초 문법
  • 시간 복잡도
  • DFS(깊이우선탐색)
  • 자잘한 에러 해결
  • 최소 힙(Min Heap)
  • tree
  • TIT (Today I Troubleshot)
  • 혼자 공부하는 자바스크립트
hELLO · Designed By 정상우.
깊은바다거북

개발 공부 기록

TIL | WIL

3/24 금 (프로젝트 기술 질답(수정중)) TIL

2023. 4. 14. 00:27

(최종 프로젝트 진행중)

오늘은 프로젝트에서 나올 수 있는 예상 기술 질문에 대한 질답 시간을 가졌다.


※ 이하는 스스로 공부하며 적어둔 노트이며 불확실한 내용이 있을 수 있습니다. 학습용으로 적합하지 않음을 유념해주세요. ※

커서 기반 페이지네이션 v.s. 오프셋 기반 페이지네이션

과 각각의 장단점

  • offset 이전/다음 페이지의 결과를 요청할 때 페이지의 번호와 크기를 지정해 이전 페이지의 마지막 결과 행의 오프셋을 사용하여 다음 페이지의 결과를 가져오는 방식이다. offset/limit을 사용한 쿼리 이용
    • 장점:
      • 페이지 단위로 구분해 유저가 페이지를 선택하고 이동가능하며 전체 페이지의 갯수를 알 수 있다.
      • 직관적이고 구현이 간단하다. (어드민 페이지 같은 단순한 경우에 적합)
    • 단점:
      • 데이터 중복, 사용자가 사용하는 동안 새로운 게시글이 생기고 사용자가 다음 요청을 진행했을 때 데이터 값이 중복이 된다. (ex>최신 데이터가 생기면 1페이지에서 본 페이지가 2페이지로 밀리기 때문에 다음 페이지를 눌렀으나 이전 페이지가 보이는 현상이 생긴다. )같은 원리로 삭제 되었을 때 특정 게시글이 조회되지 않는 현상이 있을 수도 있다.
      • offset 값이 클 경우 앞에 있는 모든 데이터를 다 읽어야 하기 때문에 뒤로 갈수록 속도가 저하된다.
      • 필요하지 않은 결과도 가져오기 때문에 리소스가 낭비될 수 있다.
  • cursor-based

    이전/다음 페이지의 결과를 요청하면서 쿼리에 커서(cursor)를 사용하여 다음 페이지의 결과를 가져온다.

    • 장점:
      • 첫 페이지의 쿼리는 리밋으로 설정한 개수로 잘라서 보여지고 이후 페이지에 대한 요청은 사용자에게 응답한 데이터 중 마지막 게시글이 커서가 되어 데이터 중복 발생을 막을 수 있다.
      • 이전/다음 페이지의 결과를 검색하면서 커서를 사용하여 다음 페이지의 결과를 가져오기 때문에 페이지가 많아져도 검색 속도가 저하되지 않는다.
      • 데이터베이스에서 필요한 만큼만 결과를 가져오기 때문에 리소스 사용이 효율적이다.
      • 유저가 접속해 실시간으로 사용하는 경우 커서 기반이 유리하다.
    • 단점:
      • 커서 기반 페이지네이션을 위해서는 정렬 기준에 포함되는 필드 중 하나 이상은 반드시 유니크값을 가져야 한다. 이렇게 각 페이지의 시작 위치를 식별하는데 사용 되는 커서를 유지 관리 해야하므로 복잡성이 증가할 수 있다.
      • 이전/다음 페이지 이외의 페이지 이동이 불가능 하다. 사용자가 특정 페이지로 이동하려면 추가적인 작업이 필요하다.
      • 조회 시 정렬 조건이 많아지거나 서버-클라이언트 사이에 커서 인터페이스가 추가 될 수록 구현이 어려워진다.

    하지만 두 방법 모두 적절한 페이지에서 사용하지 않으면 효율적이지 않을 수 있기 때문에 사용할 페이지나 서비스에 대한 이해도가 필요할 것 같다. 일반적으로 대규모 데이터베이스에서는 커서 기반을 작은 규모일 경우에는 오프셋 페이지 네이션을 사용하는 것이 구현 및 유지보수가 더 쉽고 편리할 수 있다.


    도움 많이 받은 블로그:

    커서 기반 페이지네이션 (Cursor-based Pagination) 구현하기
    사실 처음에는 이 주제로 포스트를 쓰려고 했던건 아니고 Apollo GraphQL 에서 커서 기반 페이지네이션 구현 을 주제로 글을 쓰려고 했습니다. 그런데 막상 찾아보니 백엔드-프론트엔드를 함께 고려하여 커서 기반 페이지네이션을 잘 설명해 놓은 포스트가 없는 것 같아 이 글을 먼저 쓰게 되었습니다. 페이지네이션? 보통 서버에서 데이터를 가져올 때 모...
    https://velog.io/@minsangk/커서-기반-페이지네이션-Cursor-based-Pagination-구현하기

    면담 때 얻은 팁:

    오프셋 기반은 O(N)이고 자료구조의 배열과 같다. 인덱스로 찍으면 주소를 산술 계산해서 O(1)로 얻어올 수 있지만, 원하는 ‘인덱스’를 계산해서 얻어내는 데 바로 오프셋 페이지네이션처럼 O(N)이 걸리는 거라고.

    커서기반은 O(1)이고 자료구조의 더블 링크드 리스트와 같다고 했다. 커서가 앞뒤를 가리킨다는 점에서.

JWT의 단점

  • 알고리즘 없이 암호화가 안 된 페이로드 정보가 그대로 노출된다는 점.
  • 한 번 발급되면 토큰의 유효기간을 변경할 수 없다는 점. 만료 기간이 짧으면 보안성은 높아지지만 자주 토큰을 갱신해야 하므로 부담이 될 수 있다.
  • JWT를 사용할 때 서버는 클라이언트에게 발급된 토큰만 검사해 서버 측에서 로그아웃 처리가 어렵다는 점.
  • 오래된 암호화 알고리즘(파훼가 보고된)을 개발자가 모르고 선택해서 쓸 시 보안 우려가 있다는 점.
  • 토큰 헤더에 이 토큰이 사용할 알고리즘을 명시한다는 점. 해커가 중간에 탈취해서 ‘이 토큰이 사용하는 암호화 알고리즘 = none’이라고 수정해버리면, 서명 확인 프로세스를 우회할 수 있게 된다. 즉, 이 토큰을 받은 서버 입장에서 ‘어, 얘는 처음부터 알고리즘이 none이었구나’ 하고선 서버에 저장된 암호키와 대조해 풀어보는 작업 없이 그대로 유효한 토큰이라고 통과시켜버리는 것이다.
  • 또 서버는 RSA 비대칭 알고리즘으로 서명해서 배포했는데, 해커가 alg 헤더를 HS256처럼 대칭키 알고리즘으로 바꿔서 그 토큰을 서버에 전달하면, 그대로 뚫리게 될 수 있다는 점. 서버 코드에서 토큰의 알고리즘 헤더를 확인하고 체크하는 과정을 넣어야 방지할 수 있다.

    ⇒ 대칭키, 비대칭키? 참고하면 좋을 얄코 동영상:

    HTTPS가 뭐고 왜 쓰나요? (Feat. 대칭키 vs. 비대칭키)
    #https #대칭키 #비대칭키 오늘날 운영하는 웹사이트를 HTTPS로 세팅하는 것은 필수가 되었죠. 하지만 이 HTTPS란것이 무엇이며, 이를 사용하는 것이 왜 중요할까요? 🤔 정보를 암호화하고 다시 푸는 두 방식인 대칭키와 비대칭키 시스템을 사용해서 어떻게 HTTPS가 사이트 이용의 🚨보안성을 강화하는지 알아보기로 해요. = = = 🏠 얄코사이트: https://www.yalco.kr 🛒 개발자스티커 구매: https://smartstore.naver.com/honeykers 🎥 가장 쉬운 Git 튜토리얼: https://youtu.be/FXDjmsiv8fI 🎥 포인터 쉽게 알아보기: https://youtu.be/u65F4ECaKaY 🎥 객체지향에 대해 알아보기: https://youtu.be/vrhIxBWSJ04 🎥 객체지향 디자인 패턴: https://youtu.be/lJES5TQTTWE 🎥 함수형 프로그래밍이란?: https://youtu.be/jVG5jvOzu9Y 🎥 쿠키 vs 세션 vs 캐시: https://youtu.be/OpoVuwxGRDI 🎥 프로세스와 스레드: https://youtu.be/iks_Xb9DtTM 🎥 비동기 프로그래밍: https://youtu.be/m0icCqHY39U 🎥 REST API 알아보기: https://youtu.be/iOueE9AXDQQ 🎥 GraphQL 알아보기: https://youtu.be/EkWI6Ru8lFQ 🎵 엔딩송 : 권민호, 김한영 - Let's Dance 🎼 자료출처 : https://gongu.copyright.or.kr 🎼 Music promoted by DayDreamSound : https://youtu.be/L16GOic2UXw 🎬 영상 주요 포인트 🛡 HTTPS를 사용하는 이유 HTTP'S'의 s는 secure에요. 즉 기존의 HTTP 사이트보다 안전하다는 얘기죠. 무엇으로부터 안전할까요? 크게 둘로 나뉘어요. 먼저, 내가 어떤 웹사이트에 보내는 정보를 다른 누군가 훔쳐보지 못하게 합니다. ... 다른 하나는, 여러분이 접속한 사이트가 진품인지, 신뢰할 수 있는 사이트인지를 판별해주는거에요. 🔑 대칭키의 개념 그동안 널리 사용되어 온 건 대칭키 방식이에요. 메시지를 보내는 쪽과 메시지를 받는 쪽이 메시지를 암호화하고, 이를 다시 메시지로 바꾸는 즉 복호화하는 같은 방식을 공유하는거죠. ... 이런 임의의 문자열이 있어요. 이걸 '키'라고 부릅니다. (예시: @#%#%$^#$^#) 4에 3을 곱하면 12가 되죠. 상대방에게 보내고자 하는 메시지를 이 '키'와 함께 어떤 알고리즘에 넣고 돌리면 이처럼 전혀 알 수 없는 암호문이 만들어져요. 12에서 4를 얻어내려면, 3으로 나눠야 하는것처럼 이 암호문을 받은 사람이 이걸 해독하려면 이 키값을 알고, 이 알고리즘을 거꾸로 돌리면 돼요. (딱) 이 과정을 복호화라고 하죠. 이 '키'값을 알지 못하면 절대 이 암호문을 해독할 수 없어요 🗝 비대칭키의 개념 이를 보완한 새 방식이 1970년대에 수학자들에 의해 개발됐어요. 비대칭키, 또는 공개키라 불리는 시스템이죠. 여기에는 두 개의 키가 사용돼요. 각각 A키와 B키라고 부를게요. 이 둘은 한 쌍이에요. 서로 다르기 때문에 '비대칭키'라고 불립니다. 이 암호화 방식을 개발자들은 보통 '공개키'라고 많이 부르는데 이 영상에서는 여러분이 헷갈리지 않도록 '대칭키'와 상반되는 개념으로 '비대칭키' 방식이라 부를게요. 대칭키 시스템에서는 어떤 키로 암호화를 하면 같은 키로 복호화를 할 수 있었지만, 여기서는 A키로 암호화를 하면 B키로만 복호화할 수 있어요. 반대로 B키로 암호화를 하면 A키로만 풀 수가 있죠. 🏢 Certificate Authority 일단 네이버가 우리에게 뿌린 공개키. 이게 정품인지를 확인할 수 있어야죠. 네이버가 아니라 네이놈의 공개키일수도 있으니까요. 이걸 인증해주는 공인된 민간기업들이 있어요. Certificate Authority, 줄여서 CA 라고 부르죠. 이런 회사들이에요. 아무나 차려서 될 수 있는게 아니라 엄격한 인증과정을 거쳐야 CA를 할 수 있는거에요. 여러분의 브라우저, 즉 크롬이나 사파리, 파이어폭스, 엣지, 익스플로러 등의 프로그램에는 이 CA들의 목록이 내장돼있어요. 🌟 위 개념들을 사용해서 구체적으로 어떻게 HTTPS의 보안이 이뤄지는지 영상에서 확인하세요!
    https://www.youtube.com/watch?v=H6lpFRpyl14

JWT의 신뢰할 수 있는 대안, PASETO

: Platform Agnostic SEcurity TOken

: 강력한 서명 알고리즘 제공. 개발자가 알고리즘을 선택하지 않고 ‘파세토 버전’을 선택하면 된다. 최신 암호화 루트 2개만이 선택지로 활성화 및 제공된다.

파세토 버전 1: (생략)

파세토 버전 2: 더 현대적. “v2.local.암호화된페이로드.바닥글” 형태.

알고리즘 헤더가 존재하지 않아서 해커의 선택지가 줄어든다. AEAD 변조할 수 없다. 단순 로컬 대칭 키 알고리즘을 사용해도 페이로드가 (단순 인코딩이 아니라) 암호화되므로 데이터가 노출되지 않는다.

(참고: https://dev.to/techschoolguru/why-paseto-is-better-than-jwt-for-token-based-authentication-1b0c )


Uploaded by N2T

    'TIL | WIL' 카테고리의 다른 글
    • 3/27 월 (Timezone 트러블슈팅 정리중) TIL, TIT
    • 3/25 토 (중복 렌더링 트러블슈팅 완료) TIL, TIT
    • 3/23 목 (이래서 다들 오픈일에 비상 근무 하는 거구나…) TIL, TIT
    • 3/22 수 (HTTPS로 배포하기 사전 조사 및 과정) TIL, TIT
    깊은바다거북
    깊은바다거북

    티스토리툴바