20210702

Jin·2021년 7월 2일

시도해볼것

  • 김교수의 학습법에 따르면, 자기화가 중요하다고 한다. 현재 보고 있는 http 책은 파편적으로 정보가 전달되는 느낌이 있어서, (그럴 수밖에 없다고도 생각이 들지만) 조금 더 왜를 건드려주는 책을 함께 읽는 것이 좋다고 판단이 되었다. -> 웹을 지탱하는 기술을 함께 가져가 보자.

Facts

프로그래머스 <가장 큰 수> 풀이

문제: https://programmers.co.kr/learn/courses/30/lessons/42746
풀이: https://github.com/gringrape/daily_coding_dojo/tree/main/20210702/javascript

풀이소감

문제의 핵심은 수를 나열하는 기준이었다. 이어붙인 수가 최대가 되는 방향으로 주어진 숫자들을 정렬해야 했다. 정렬의 기본은 두개의 원소를 비교하는 것 이므로, 두개의 숫자를 이어붙였을때, 더 커지는 방향으로 정렬 규칙을 설정해 주었다. 이 부분을 잘한 것 같다.

의식적으로 실천한 것들

  • 테스트 케이스를 통제 가능한 것 부터 만들기.

그림으로 배우는 HTTP 네트워크 1장 정리(정리 중!!)

https://velog.io/@gringrape200/%EC%9B%B9%EA%B3%BC-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EC%9D%98-%EA%B8%B0%EB%B3%B8

웹을 지탱하는 기술 독서

HTTP 헤더.
메시지 바디에 대한 부가적인 내용- 메타정보를 함께 전달하고 싶을때 활용한다.
HTTP 는 역사적으로 메일 프로토콜에서 파생되었기 때문에, 메일 프로토콜을 이해해야 온전하게 이해할 수 있다.

메시지와 함께 메타정보까지 전송해야 캐시등의 기능이 온전하게 실현될 수 있다.

메시지의 날짜를 정하기 위한 Date 필드. 메시지 컨텐츠의 종류를 나타내는 content-type, 클라이언트에서 처리할 수 있는 컨텐츠의 종류와 우선순위를 알려주는 accept 헤더등에 대해서 배웠다.

DOM 을 깨우치다 독서

이벤트란?
이벤트는 DOM 객체의 특정한 시점을 뜻한다. DOM 객체는 UI, Javascript 등의 영향을 받아 변하게 되는데 이때, 다양한 시점을 지정할 수 있고, 이에 따른 동작을 지정할 수 있다.

비동기와 논블로킹이 떠올랐다. 비동기는 어떤 작업을 나중에 다시 처리하는 것이 필요한데, 이때 바로 시점, 이벤트라는 개념이 필요한 것 같았다.

알고리즘 문제 풀이 디버깅 논의

  • 버그의 원인을 찾는 일에서 가장 중요한 부분은 오류의 범위를 한정하는 것이다.
  • 목적이 구분된 테스트 케이스가 있다면 가장 좋다 -> 해당 목적의 테스트들로 범위를 한정하여 버그를 찾아 볼 수 있다.
  • 육안으로 코드를 봐서 문제를 해결할 확률은 매우 낮다. 이미 어떤 오개념 속에 있을 확률이 크기 때문에, 제로부터 정상적인 동작을 의심해야 하고, 재검증 해야 한다.
  • 재검증을 위해서 다양한 도구를 활용할 수 있다. 해당 포인트에 디버깅을 할 수도 있고, 콘솔을 찍어서 원하는 결과값인지 확인할수도 있다. 가장 좋은 것은 역시 해당 테스트 케이스를 추가해서, 리팩토링에도 도움이 될 수 있도록 하는 것이다.

그림으로 배우는 HTTP - HTTPS

http 에서는 통신을 위한 보안 기능을 제공하지 못한다. 따라서 다음의 위험에 노출된다.

  • 도청
  • 위장
  • 변조

HTTPS 는 HTTP 에 보안기능을 추가한 프로토콜로 위의 문제들을 해결하기 위한 기술들을 정의하고 있다.

도청이란, 통신의 내용이 제 3자에게 노출되는 것을 말한다. 통신 내용의 암호화를 통해서 도청의 위협을 줄일 수 있다. 일반적으로 동일 세그먼트 내에서의 도청은 네트워크를 흐르는 패킷을 수집하기만 하면 되므로 매우 쉽다. 그리고, HTTP 메세지는 일반적으로 암호화 되지 않은 평문이다. 따라서, 비밀을 요하는 내용이 있다면 도청을 방지하기 위한 암호화 대책을 반드시 세울 필요가 있다. HTTPS 를 프로토콜로 사용하면 비대칭키 방식과 공통키 방식을 조합하여 암호화 기능을 제공한다.

위장이란, 통신 당사자가 아니 주체가 통신의 당사자처럼 개입하는 것을 뜻한다. 이를 방지하기 위해서는 상대방이 믿을 만한 통신 주체인지 확인하기 위한 도구를 사용할 필요가 있다. HTTPS 에서는 인증서를 활용하여 이러한 문제를 해결한다. 신뢰할 수 있는 인증기관을 통해 받은 인증서를 통해서 컨텐츠를 제공하는 서버가 믿을만한 서버인지 확인한다.

변조란, 송신측이 송신한 데이터가 수신자에게 도달하기 전에 변조되는 것을 뜻한다. 이를 방지하기 위해서는 데이터가 변조되었는지 여부를 확인하는 체크섬이 필요하다. HTTPS 는 Digest 기술을 활용하여 데이터의 변조 여부를 확인하는 기능을 제공한다.

HTTPS 에서는 위와 같은 기능을 수행하기 위해서, SSL 혹은 TLS 를 따르는 핸드셰이크 과정이 추가된다. 핸드셰이크 과정은 크게 두가지의 세부 프로세스로 분류할 수 있다. 이 중 첫번째는 서버 인증과정이고, 두번째는 통신내용 암호화를 위한 키 교환 과정이다.

서버 인증과정에서는 신뢰할 수 있는 인증기관의 서명이 담긴 인증서과 서버의 공개키와 함께 전달된다.
해당 인증기관의 공개키를 이용해서 해당 서명의 신뢰성을 확인하고, 이를 통해 서버의 신뢰성을 확인하게 되는 과정이 인증과정이다.

두번째 과정은 암호화를 위한 키교환 과정이다. 서버의 공개키를 활용하여 클라이언트에서는 암호화에 쓰일 공통키를 암호화에서 서버로 전달하고, 서버는 이를 복호화하여 공통키를 만들고 통신 암호화에 사용하게 된다.

암호화 방식으로 공통키 방식이 사용되는 이유는 암복호화의 비용때문이다. 서로 공개키를 교환한 것으로 암호화된 통신을 수행하기 위한 조건은 갖춰졌지만, 비대칭 키 방식의 암복호화에는 비용이 많이 들기 때문에, 연산 비용이 적은 공통키 암호화방식을 이용하게 된다.

그림으로 배우는 HTTP - 인증

HTTP 에서 정의하고 있는 인증은 Basic 방식과 Digest 방식이 있다. 두 방식 모두 보안상의 이유로 현재 활용되고 있지는 않다.

Basic 방식을 활용하면, 사용자의 개인정보를 Base64 인코딩을 이용하여 헤더로 전송하게 된다. Base64 는 인코딩일 뿐으로, 얼마든지 디코딩이 가능하기 때문에, 보안기능이 거의 없다.

다이제스트 방식은 챌린지 코드와 리스폰스 코드를 활용한다. 서버측에서 인증과정 전에 챌린지 코드를 클라이언트로 전송하면, 클라이언트에서는 해당 코드를 활용하여 사용자의 인증정보로 체크섬을 만든 후에 서버에 전달한다. 서버에서는 이 체크섬을 활용하여 사용자의 인증을 진행하게 된다.

이 방식은 사용자의 개인정보가 체크섬으로 전달되어 직접적으로 전달되지 않기 때문에, Base64 방식에 비해 낫지만, 여전히 보안상의 위협에서 자유로울 수 없다.

가장 널리 사용되는 방식은 폼 방식 이다. 이러한 방식에서 사용자는 개인정보를 폼에 입력하고 이러한 개인정보를 사용하여 인증하게 된다. 실제로 폼 방식을 구현하는 방식은 서버마다 다르다. 대표적인 방식으로는 세션 방식과 쿠키(토큰) 방식이 있다.

HTTP 는 상태가 없는 프로토콜이다. 따라서 인증과 같이 사용자의 상태가 변하는 것을 처리하기 위해서는 해당 상태를 저장해줄 필요가 있다. 이때, 상태가 저장되는 위치에 따라서, 세션 방식인지 토큰 방식인지가 결정된다.

세션 방식에서는 서버 상에 사용자의 인증 상태를 저장한다. 이후 사용자에게 세션의 id를 쿠키를 통해 발급하여 해당 세션에 접근할 수 있도록 하는 방식으로 사용자 인증을 처리한다.

토큰 방식에서는 클라이언트에 사용자의 인증 상태를 저장한다. 서버는 로그인이 완료되면 사용자의 정보를 담은 토큰을 쿠키에 담아 반환하며, 사용자는 이후에 이 토큰을 매 요청마다 함께 보내는 방식으로 인증정보를 전달한다.

도메인 주도 설계 - 값 객체

  • 최적화
  • 불변성
  • 데이터 셰어링
  • 개념적 완결성
  • 식별성을 갖지 않음

데이터 셰어링이 가장 기억에 남는 주제였다. 함수형 프로그래밍에서 대수적 자료구조로 배열을 정의했을때, 처음 접해봤던 개념이었다.

값객체적 속성을 갖는 객체들이 엔티티로 관리되고 숫자가 매우 많아지면, 객체의 수가 매우 많이 증가해서 관리가 어려워진다. 값 객체를 사용하면 이런 문제가 해소된다. 하나의 인스턴스를 여러곳에서 참조하는 방식으로 구현한다.

코딩인터뷰 완전 분석 스터디

Feelings

스터디에서 짝코딩으로 문자열에서 수열찾기를 코딩해보았다! 함께 탐구하고 알아내는게 꿀잼이다. 유일한 문제는 체력.. 짝프로그래밍 할때의 리듬감이 좋다. 생각과 의도를 계속해서 아주 분명하게 드러내야 하는 것도 좋다. 짝프하는 곳으로 이직하고 싶다.. 없겠지만.

씻고 나오니 기분이 좋아지면서 공부할 수 있는 힘이 생겼다. 좀 더 하고자자.

Affirmation

  • 어려움은 능력개발의 기회일 뿐.
  • 지금 잘하고 있는가 보다 지금 자라고 있는가에 훨씬 더 큰 방점을 찍자.

0개의 댓글