CHAAANY ARCHIVE

전체 글

554개의 기록을 주제별로 둘러보세요.

로그인했는데도 다른 사람의 주문은 왜 볼 수 없어야 할까?

주문 상세 화면의 주소가 /orders/123이라고 하자. 123을 124로 바꿨을 때 다른 사람의 주문이 보인다면 로그인 기능은 있어도 접근을 제대로 막지 못한 것이다. 서버가 ‘누가 요청했는가’만 확인하고 ‘그 사람이 이 주문을 볼 수 있는가’를 확인하지 않았기 때문이다.지난 글에서 로그인 이후의 요청을 세션으로 사용자와 연결하는 과정을 살펴봤다. 세션이 유효하다고 모든 주문을 읽을 권한이 생기는 것은 아니다. 인증(authentication)은 요청자를 확인하는 일이고, 인가(authorization)는 그 요청자가 특정 대상에 특정 동작을 해도 되는지 판단하는 일이다.URL의 번호는 접근 권한이 아니다사용자 A가 주문 123의 상세 화면을 요청한다고 하자. 서버는 세션으로 A를 확인하고, 저장소에..

함수가 자신을 다시 부르면 이전 계산은 어디에 남을까?

폴더 안의 파일을 모두 찾는다고 하자. 지금 폴더의 파일을 확인한 뒤 하위 폴더를 열어 같은 일을 반복하면 된다. 그런데 하위 폴더의 처리가 끝났을 때, 프로그램은 원래 폴더의 어디로 돌아와 다음 폴더를 볼까?재귀(recursion)는 함수가 같은 형태의 더 작은 문제를 풀기 위해 자기 자신을 다시 호출하는 방식이다. 재귀 호출은 시작한 일을 잊고 처음부터 다시 하는 게 아니다. 아직 끝나지 않은 호출마다 돌아올 위치와 지역 상태가 남는다.폴더를 내려갈 때 무엇을 기억하나예를 들어 사진/2025/여행이라는 폴더를 차례로 방문한다고 하자. 사진의 파일을 읽다가 2025를 열고, 그 안에서 여행을 연다. 여행의 처리가 끝나면 2025에 다른 폴더가 있는지 확인해야 한다. 그 작업이 끝나면 다시 사진에 남은 ..

서버 기록의 시각이 더 늦으면 그 일이 나중에 일어났을까?

서버 A의 기록에는 주문 변경이 10시 00분 05초, 서버 B의 기록에는 알림 발송이 10시 00분 04초라고 적혀 있다. 숫자만 보면 알림이 먼저 나간 것 같다. 하지만 두 서버의 시계가 같은 순간을 정확히 가리킨다는 보장은 없다. A의 시계가 2초 빠르다면 실제로는 주문 변경 뒤에 알림이 나갔을 수 있다.여러 서버가 함께 일할 때 표시된 시각과 사건의 순서를 구분해야 하는 이유다. 기록의 시각은 장애를 찾는 데 유용하지만, 그것만으로 두 사건의 원인과 결과를 확정할 수는 없다.각 서버의 시계는 조금씩 다르다타임스탬프(timestamp)는 사건에 붙인 시각 또는 순서 값이다. 서버는 보통 운영체제가 제공하는 시계를 읽어 기록한다. 독립된 컴퓨터의 시계는 기준 시각과 흐르는 속도가 서로 조금씩 다를 수..

배송 상태가 같아도 순서를 지켜야 할까? 정렬이 결정하는 것들

주문 목록을 최신순으로 보다가 배송 상태별로 다시 묶는다고 하자. 같은 상태의 주문은 어떤 순서로 보여야 할까? 최신순이 유지되길 기대할 수도 있고, 주문 번호순으로 보길 기대할 수도 있다. “정렬한다”는 말만으로는 답이 정해지지 않는다. 무엇을 기준으로 비교하고, 기준이 같을 때 어떤 순서를 남길지부터 정해야 한다.지난 글에서는 주문 수가 늘 때 검색 방법의 작업량이 어떻게 달라지는지 살펴봤다. 정렬에도 작업량이 들지만, 결과의 순서가 맞는지를 먼저 확인해야 한다. 빠르게 끝났더라도 같은 상태의 주문을 매번 다른 순서로 보여 준다면 원하는 정렬이 아닐 수 있다.무엇을 비교해야 할까정렬(sorting)은 여러 값에 순서를 정해 나열하는 작업이다. 숫자만 정렬할 때는 작은 값과 큰 값을 비교하면 된다. 주..

로그인했는데 왜 다음 페이지에서는 비밀번호를 다시 묻지 않을까?

로그인 화면에서 비밀번호를 한 번 입력한 뒤에는 상품을 보고, 주문을 확인하고, 페이지를 새로 고쳐도 대개 로그인이 유지된다. 매 요청마다 비밀번호를 다시 보내는 게 아니라, 서버가 로그인 결과를 이어서 확인할 방법을 만들었기 때문이다.이 방법을 세션(session)이라고 한다. 세션은 여러 요청을 같은 로그인 상태와 연결하는 기록이다. 이 글에서는 서버가 상태를 보관하고 브라우저에는 식별자만 전달하는 방식을 예로 든다. 로그인 상태를 담는 방법은 서비스마다 다르므로 모든 웹사이트가 이 방식으로 구현됐다는 뜻은 아니다.비밀번호 확인과 이후 요청은 다른 일이다로그인할 때 서버는 계정 상태와 입력한 인증 수단을 확인한다. 인증(authentication)은 지금 요청한 사람이 그 계정의 정당한 사용자라는 근..

육아휴직 8주차, 아기의 백일과 안동에서 보낸 일주일

육아휴직 8주차.아기를 데리고 처음으로 장거리 운전을 해서 안동에 다녀왔다. 아기가 딱 백일 되는 날도 안동에서 맞았고, 아내와 오랜만에 같이 뛰고, 나는 처음으로 10km를 달렸다. 가족들과 함께 보내다 보니 일주일이 금방 지나갔다.아기와 첫 장거리 운전, 안동으로9월 21일 월요일은 안동으로 내려가는 날이었다. 전날부터 짐을 열심히 챙겼고, 아침 9시에는 대여했던 백일상을 반납했다. 남은 짐까지 차에 싣고 출발! 아기가 중간중간 쉬어가야 해서 전날 운전 코스도 미리 짜뒀다. 덕평휴게소와 단양휴게소를 들르면 대략 3분의 1, 3분의 2 지점에서 쉴 수 있었다.덕평휴게소에서 기저귀를 갈고 분유를 먹이는데 아내가 갑자기 “야!” 하고 소리쳤다. 무슨 일인가 했더니 아내의 절친과 그 어머님, 아기도 거기 있..

주문이 많아지면 검색은 얼마나 느려질까? 빅오를 숫자로 읽기

주문이 세 건일 때는 목록에서 번호 하나를 찾는 일이 금방 끝난다. 주문이 만 건이면 이야기가 달라진다. 지난 글에서 배열, 해시 테이블, 큐로 같은 주문을 다르게 다루는 이유를 살펴봤다. 이번에는 주문 수가 늘 때 확인해야 할 항목이 얼마나 늘어나는지 세어 보자.빅오(Big-O notation)는 입력 크기가 커질 때 작업량이 어떤 속도로 늘어나는지 나타내는 표기다. 실제 실행 시간을 초 단위로 약속하는 표기는 아니다. 컴퓨터의 속도, 데이터가 놓인 위치, 구현 방식이 달라도 입력이 늘 때 반복 횟수가 어떻게 변하는지 비교하는 데 쓴다.앞에서부터 찾으면 몇 건을 확인할까주문 번호를 배열 [17, 42, 23, 31, 55]에 접수 순서대로 담았다고 하자. 17번을 찾으면 첫 비교에서 끝난다. 55번은 ..

요청이 시간 초과되면 서버 작업도 멈출까?

주문 버튼을 눌렀는데 화면에 시간 초과 오류가 뜬다. 다시 누르면 될까? 화면이 답을 받지 못했다는 사실과 주문이 만들어졌는지는 다른 문제다. 서버가 요청을 받기 전에 연결이 끊겼을 수도 있고, 주문을 저장한 뒤 응답만 돌아오지 않았을 수도 있다.시간 초과(timeout)는 기다리는 쪽이 정한 시간이 지났다는 뜻이다. 상대가 작업을 하지 않았다는 확인서는 아니다. 앞서 주소창에서 첫 화면까지 어떤 일이 일어나는지 따라갔다면, 이번에는 요청을 보낸 뒤 답이 오지 않는 구간을 살펴보자. 아래 주문과 시간은 동작을 설명하기 위한 예다.같은 오류 화면 뒤에 세 가지 상태가 있다클라이언트(client)는 서버에 요청을 보내는 프로그램이다. 여기서는 브라우저가 클라이언트다. 브라우저가 POST /orders 요청을..

배열, 해시 테이블, 큐는 언제 쓰는 걸까?

주문 목록을 만든다고 생각해보자. 주문 번호로 한 건을 찾고, 최근 주문 20건을 화면에 보여주고, 접수된 순서대로 주문을 처리해야 한다. 주문이라는 데이터는 같지만 세 작업이 원하는 답은 다르다.자료구조(data structure)는 데이터를 저장하고 꺼내는 방법을 정해둔 형태다. 알고리즘(algorithm)은 저장된 데이터를 읽고 바꿔 원하는 답을 구하는 절차다. 어떤 자료구조를 쓰든 먼저 주문을 어떤 기준으로 찾고, 어떤 순서로 보여주고, 언제 변경하는지 알아야 한다.설명을 위해 주문 세 건이 차례로 들어왔다고 하자. 실제 주문 기록이 아니라 각 구조의 움직임을 보기 위한 예다.접수 순서 주문 번호 상태첫 번째 17 대기두 번째 42 대기..

주소창에 URL을 입력하면 무슨 일이 일어날까?

주소를 입력하고 화면이 뜰 때까지 몇 초가 걸린다. 이 시간을 통째로 “서버가 느리다”고 말하기 쉽지만, 서버에 요청을 보내기 전에도 할 일이 있다. 주소를 찾고 연결해야 한다. 서버에서 문서를 받은 뒤에는 그 문서가 필요로 하는 파일을 더 가져오고 화면을 그린다.브라우저(browser)는 웹 주소로 문서를 요청하고 받은 내용을 화면에 보여 주는 프로그램이다. 한 페이지가 늦게 뜨는 이유를 알려면 이 과정에서 어디까지 끝났고 어디서 기다리는지 봐야 한다. 아래에서는 처음 방문한 상품 페이지 한 곳을 따라가 본다. 숫자와 주소는 흐름을 설명하기 위한 예다.주소를 나눠 읽는다웹 주소(Uniform Resource Locator, URL)는 가져올 자원의 위치와 접근 방법을 담는다. 다음 주소를 보자.http..

육아휴직 7주차, 아내 생일상과 아기 백일

육아휴직 7주차.이번 주는 아내 생일상도 차리고, 주말에는 아기 백일상도 차렸다. 생일 준비는 마음처럼 잘 안 된 부분도 있었는데, 얘기하고 나니 조금씩 괜찮아졌다. 백일상은 생각보다 잘 돼서 아주 만족스러웠다 :)아내 생일상 차리느라 아침부터 바빴다9월 14일 월요일은 아내 생일이었다. 전날 조용히 잠든 뒤 아침부터 생일상을 차리느라 바빴다. 양지 소고기 미역국이랑 잡채를 하고, 반찬가게에서 안동찜닭이랑 제육볶음, 나물 네 가지를 주문했다. 출산 후 첫 생일상이었는데 아내가 맛있게 먹는 걸 보니 안도했다.아내가 산책을 간 뒤에는 아기를 보며 시간을 보냈다. 오후 3시쯤 아내랑 아기랑 백화점에 나가 카페에서 도란도란 얘기도 했다. 5시쯤 집에 와서 누워 쉬다가 6시 40분쯤 아기를 아기체육관에서 놀게 했..

로그 메트릭 트레이스는 장애를 어떻게 다른 각도에서 보여줄까? 관측 가능성의 세 단서

사용자가 결제 버튼을 눌렀는데 5초 뒤 오류가 났다고 하자. 서버 로그 한 줄만 보면 예외 메시지는 찾을 수 있어도 언제부터 얼마나 많은 요청이 느려졌는지, 데이터베이스와 외부 결제 중 어디에서 시간이 쓰였는지 알기 어렵다.관측 가능성(observability: 시스템 밖으로 나온 신호를 이용해 내부 상태와 실패 원인을 추론할 수 있는 정도)은 데이터를 많이 쌓는 것과 다르다. 로그, 메트릭, 트레이스가 어떤 질문에 답하도록 설계됐는지가 중요하다.로그는 한 사건의 구체적인 맥락을 남긴다로그(log: 특정 시점에 애플리케이션이나 시스템에서 일어난 사건을 구조화해 남긴 기록)는 오류 메시지, 주문 식별자, 상태 전이, 재시도 횟수처럼 한 사건의 세부 정보를 담는다.time=10:01:03level=error..

728x90