0207 TIL

looggi·2023년 2월 7일
1

TILs

목록 보기
16/114
post-thumbnail

네트워크

HTTPS 원리

  1. HTTPS의 원리를 설명해주세요

    HTTPS는 보안된 형태의 HTTP프로토콜로 소켓 통신에서 SSL을 통해 세션 데이터를 암호화합니다. SSL은 서버가 CA를 통해 발급받는 인증서로
    HTTPS사용을 위해서는 SSL인증서가 필요합니다

    1.서버가 퍼블릭, 프라이빗 키를 생성하고
    2.인증서를 발급받기위해 CA에 퍼클릭키 +A를 CA에 전달한다
    3.CA에서 SSL인증서를 발급하고
    4.CA에서 SSL인증서를 암호화하기 위해 CA의 공개키와 프라이빗키를 생성해서 ca프라이빗 키를 이용해서 SSL인증서를 암호화한다
    결국 CA에서 암호화된 SSL인증서를 서버에 넘겨주는 것
    5.주고받을 데이터의 암호화를 위한 동일한 대칭키(데이터를 암호화하는 키)를 얻는다
    HTTPS는 SSL을 이용한 HTTP 통신방식입니다. 클라이언트가 서버에 처음 접속 요청을 보내면 서버는 CA에서 발급받은 인증서와 퍼블릭키를 응답합니다. 클라이언트는 CA의 유효성을 확인하고 서버는 먼저 CA에서 인증서를 발급받아 신뢰할 수 있는 서버라는 것을

TCP 연결과정

  1. TCP 3 way handshake란 무엇인지 설명해주세요
    TCP가 신뢰성있는 통신을 위해 클라이언트와 서버가 서로 준비된 상태인지 확인하는 것으로 TCP/IP 프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 세션을 수립하는 과정입니다.
    처음 클라이언트가 서버에게 접속을 요청하는 SYNC 를 보내면 서버가 클라이언트에게 SYNC, ACK 패킷을 발송한다 마지막으로 클라이언트가 패킷을 받은 후 서버에게 ACK 를 보내고나면 연결이 성립되고 데이터를 주고받을 수 있는 상태가 됩니다.
    이 과정을 거치고나면 클라이언트와 서버간 데이터의 정확한 전송을 보장할 수 있게 됩니다.

TCP vs UDP

  1. TCP와 UDP를 비교하여 설명해주세요
    TCP와 UDP는 모두 TCP/IP 프로토콜에서 송수신자를 연결해주는 통신 서비스를 담당하는 프로토콜로 트랜스포트층에 속합니다. TCP와 UDP는 신뢰성과 속도에 있어 차이가 있습니다. TCP(가상회선방식)는 연결지향적 프로토콜로 클라이언트와 서버가 연결된 상태에서 데이터를 주고받습니다. 이때 3way handshaking을 통해 연결을 설정하고 4way handshaking을 통해 연결을 해지합니다. 따라서 신뢰성이 있는 전송을 보장하지만 연결 설정 및 해지의 과정이 있기때문에 UDP에 비해 속도가 느립니다.
    반대로 UDP는 비연결성 프로토콜로 연결을 설정하고 해제하는 과정이 없고 데이터의 수신확인도 하지 않기때문에 속도가 빠르지만 신뢰성이 낮습니다. 따라서 UDP는 연속성이 중요한 실시간 스트리밍서비스에 사용하기 적합합니다.

CORS

  1. CORS란 무엇이고 어떻게 구현할 수 있나요
    CORS는 서로 다른 출처의 자원 공유에 대한 브라우저 차원의 정책입니다. 기본적으로 브라우저는 보안상의 이유로 다른 출처의 HTTP요청을 제한하는데 요청한 리소스의 출처가 클라이언트와 다르면 응답의 HTTP헤더에 허용할 Origin의 목록을 기재해서 교차출처자원 공유(CORS)가 가능하도록 할 수 있습니다. 이때 같은 출처인지를 판단할 때는 URL의 프로토콜, 도메인, 포트번호를 비교하여 판단합니다.
    장고에서 CORS를 확인하는 방법은 프로젝트의 settings.py에서 CORS_ORIGIN_WHITELIST에 접속을 허용하고자하는 ip나 도메인을 추가하는 것입니다.

파이썬

open()

파일을 생성할 때 사용하는 파이썬 내장함수

f=open(파일 경로, 옵션) #↔ close()

→ 옵션 rwax+tb조합해서 사용

  • r: 읽기. 기본값.
    w: 쓰기. 파일 앞에 커서가 있어서 내용을 잘라냄.
    파일이 존재하지 않는다면 생성.
    a: 쓰기. 파일 끝에 커서가 있어서 이어서 쓸 수 있음
    x: 쓰기. 파일이 없으면 생성. 있으면 에러
  • t: 텍스트 모드. 기본값
    b: 바이너리 모드

set()

list의 중복을 제거할 때 사용.
set은 순서를 보장하지 않으므로 다시 list로 바꿔도 기존의 순서를 보장할 수 없다

🦄 set method

교집합: s1.intersection(s2) == s1&s2
합집합: s1.union(s2) == s1 | s2
차집합: s1.difference(s2) == s1 - s2
교집합이 존재하지 않음: s1.isdisjoint(s2)
부분집합판별: s1.issubset(s2) :s1이 2의 부분집합인지 → T/F반환
대칭차집합: symmetric_difference == s1 ^ s2

add: 하나씩 추가(==list.append)
update: 여러개 추가(==list.extend)
remove: 값이 없으면 에러.
discard: 값이 없어도 에러x.
pop: 실행해보면 집합 맨 앞의 요소를 삭제하지만 set은 순서가 없는 자료형이므로 임의의 요소를 삭제한다고 보는 게 맞음. 빈 셋이면 에러.
clear: 비우기 set.clear()

식별자(identifier)

변수, 상수, 함수 등의 이름. 길이에 제한이 없음
숫자로 시작할 수 없음
특수기호 사용 불가

  • 카멜 표기법(Camel Case): 시작은 소문자. 이후 각 단어의 첫글자를 대문자로 → 변수/함수에 사용
  • 파스칼 표기법(Pascal Case): 모든 단어의 첫글자를 대문자로 → 변수/함수/클래스
  • 스네이크 표기법(Snake Case): 단어 사이에 언더바. 시작엔 쓰지 않음

.pyc

.py(파이썬의 소스코드)를 읽어서 실행시킬 때 자동으로 생성되는 파일
__pycache__에 저장됨

  • 컴파일 언어: 소스코드→기계어→실행

  • 인터프리터 언어: 바로 실행 (컴파일어보다 느림)
    소스코드→기계어 과정을 .pyc로 저장해두고 이후에는 바로 실행할 수 있도록함

  • 수동으로 컴파일하는 방법:

#터미널에서
python -m comileall
#또는
#파일에서
import py_compile
py_compile.compile(파일명)

프로그래머스 문제풀기

➡️행렬의 덧셈

def solution(arr1, arr2):
    ans=[]
    for i in range(len(arr1)):
        row=[]
        for j in range(len(arr1[0])):
            row.append(arr1[i][j]+arr2[i][j])
        ans.append(row)
    return ans

def solution(arr1, arr2):
    ans=arr1
    for i in range(len(arr1)):
        for j in range(len(arr1[0])):
            ans[i][j]=arr1[i][j]+arr2[i][j]
    return ans
  • 행마다 값을 구해서 row에 append한 다음 row를 ans에 다시 append하거나
  • 애초에 행렬 덧셈은 인풋이랑 아웃풋이랑 크기가 같으니까 ans에 arr1을 넣어서 각각의 요소 덧셈 값을 넣어주는 방법 2가지로 풀었는데 지금 생각해보니 그냥 1에다가 2값을 더해 넣으면 된다 ㅋㅋㅋㅋㅋㅋ 진짜 왜이러지

근데 테스트 17이 너무 오래걸려서 for문 중첩을 쓰면 안되는 건가 싶다. 행렬 길이가 500을 넘지 않는다고해서 써도 된다고 생각했는데 아닌가??

def solution(arr1, arr2):
    for i in range(len(arr1)):
        for j in range(len(arr1[0])):
            arr1[i][j]+=arr2[i][j]
    return arr1

→ 이게 좀 더 낫긴하지만 그래도 오래 걸린다.. 뭘까

import numpy as np

def sumMatrix(A,B):
    A=np.array(A)
    B=np.array(B)
    answer=A+B
    return answer.tolist()

넘파이를 써서 할 수 있다.
행렬로 바꾸고 행렬의 덧셈을 한 다음 다시 리스트로 바꿔서 리턴. 와우와우

def sumMatrix(A,B):
    answer = [[A[i][j] + B[i][j] for j in range(len(A[0]))] for i in range(len(A))]

    return answer

내가 푼 걸 한줄로 하는 사람두 있다 ㅎㅎㅋㅋㅎㅋㅎㅋ
리스트 축약식 안에 다시 리스트 축약식을 쓴다

def sumMatrix(A,B):
    answer = []
    for a, b in zip(A, B):
        l = []
        for x, y in zip(a, b):
            l.append(x + y)
        answer.append(l)
    return answer
    
# 축약식 버전  
def sumMatrix(A,B):
   answer = [[c + d for c, d in zip(a, b)] for a, b in zip(A,B)]
   return answer

# 
def solution(A,B):
    return [list(map(sum, zip(*x))) for x in zip(A, B)]

역시 인덱스 없이도 많은 걸 할 수 있다는 걸 다시 한번 깨닫는다.. 인덱스좀 잃자..

→ 처음에 zip으로 짝지어준 두 리스트를 하나의 변수x에 튜플 자체로 담고
그 튜플을 언패킹해서 두 리스트를 zip으로 다시 짝지어주면 다시 튜플에 담기는데 그 튜플을 sum한 것

profile
looooggi

0개의 댓글