0228 TIL

looggi·2023년 2월 28일
0

TILs

목록 보기
1/114
post-thumbnail

파이썬

식별자

  1. 변수나 함수 같은 식별자 길이의 제한이 있나요?
    아니요
    PEP-8 가이드라인 언급하기

식별자: 변수, 함수, 클래스, 모듈 또는 다른 객체를 식별하는데 사용되는 이름

문자 A부터 Z 또는 a에서 z 또는 밑줄 (_)로 시작(대소문자 구별)
한 개 이상의 문자로 구성됨
파이썬에서는 @, $, %와 같은 특수 문자를 식별자 내에서 사용X 파이썬은
https://sdc-james.gitbook.io/onebook/3./3.3./3.3.3.-identifiers

.pyc 파일

  1. 파이썬에는 .pyc 파일이 있습니다. .py 파일과의 차이점을 설명하세요.
    .py는 프로그래머가 작성한 Python 소스코드가 담긴 파일이고 이 파일을 읽어서 실행시킬 때 자동 생성되는 파일이 .pyc파일입니다.
    파이썬의 표준 CPython 인터프리터는 .py 파일을 실행시킬 때
    PVM이 이해할 수 있는 Byte code 형태(기계어)로 컴파일 후 컴파일된 Byte code 를 PVM이 단계별로 실행하는 과정을 거칩니다. 이때 바이트코드로 변환된 결과를 임시파일로 저장해두어 다음 실행 때 효율성을 높일 수 있도록 합니다.

+파이썬 버전별로 바이트코드가 달라서 파일명에 버전 이름을 명시해준다
+__pycache__ 디렉터리에 저장된다

https://jins-sw.tistory.com/25

내장함수 map(),zip()

  1. Python 에서 map(), zip() 함수는 어떤 역할을 하나요?
    map()은 함수를 첫번째 인자, 이터러블을 두번째 인자로 받아서 이터러블의 모든 요소들에 함수를 적용한 결과를 맵객체로 반환시켜줍니다.
    다수의 인자를 받는 함수일 경우 이터러블 인자를 추가로 넣어서 계산할 수 있고 짧은 이터러블을 기준으로 계산이 종료됩니다.
    zip()은 두 개 이상의 이터러블을 하나의 쌍으로 묶은 튜플을 반환시킵니다.

map(),zip()모두 파이썬 내장함수
맵 객체는 이터레이터라서 변수 여러 개에 저장하는 언패킹(unpacking)이 가능합니다.
→ a, b = map(int, input().split())

내장함수 VS 메서드 모양 헷갈리지 말자~~!

  • 내장함수
    built-in-func()
  • 메서드 depending on the data type of an object
    object.method(para)

https://dojang.io/mod/page/view.php?id=2286
https://www.geeksforgeeks.org/python-pass-multiple-arguments-to-map-function/

네트워크

HTTPS 통신

HTTPS == HTTP(평문 데이터 전송) + SSL(secure socket layer- 추가적인 보안계층)

요청과 응답(데이터)를 암호화해서 주고받는 통신이다~!~!

HTTPS 통신 연결 과정

① 클라이언트가 서버에 연결 요청을 보내면
② 서버는 비대칭키를 발급받음

  • 믿을 만한 서버임을 인증하기 위해서 ❓ CA에 서버의 공개키를 저장하는 인증서 발급을 요청함
  • CA는 인증서를 발급해서 CA의 개인키로 암호화해서 서버에 넘겨줌

③ 서버는 클라이언트에게 이 인증서(+서버의 공개키)를 전달
④ 클라이언트는 CA의 공개키로 이 인증서를 복호화 → 서버의 공개키를 획득함+ 서버의 유효성 검사 완료

  • CA의 리스트 및 공개키는 대게 브라우저 안에 내장되어 있다

⑤ 클라이언트는 세션키(대칭키)를 발급받음
⑥ 클라이언트가 획득한 서버의 공개키로 세션키를 암호화해서 서버에 전달
⑦ 서버는 본인의 개인키로 암호화된 세션키를 복호화해서 세션키 획득

이후 클라이언트와 서버가 세션키(대칭키이자 개인키)를 이용해서 데이터를 암호화해서 주고받는다

https://dolphinsarah.tistory.com/52

HTTPS 에서 SSL 인증서

인증서로써 클라이언트에게 신뢰할 수 있는 서버라는 것을 확인해줄 수 있고
서버의 공개키를 전달해준다

HTTPS 에서 대칭키와 비대칭키

대칭키는 서로 주고 받는 게 어렵다는 문제가 있고
이를 보완하기 위해 나온 개념이 비대칭키
→ 비대칭키를 이용해서 대칭키를 공유함

대칭키를 공유할 때는 안전성이 필요하므로 비대칭키를 사용한다

  • 대칭키는 같은 키를 사용하기때문에 하나만 탈취되어도 보안의 위험이 크다

서버는 비대칭키를 이용해서 클라이언트의 대칭키를 얻는다

  • 서버의 공개키로 암호화된 대칭키를 서버의 개인키로 복호화해서 대칭키를 획득

안전이 확보된 이후 데이터를 교환하는 과정은 속도가 중요하기때문에 대칭키를 사용해서 데이터를 주고받음

  • 대칭키의 암호화에 사용되는 연산이 비대칭키보다 빠르다
  • 암호화할 수 있는 평문 길이에도 제한이 없다
  • 대량의 데이터 암호화에 적합하다

CS

JWT의 목적

solemnly used for authentication and authorization

A user
1. logs in at an authorization server and
2. receives a JWT token which is signed with the private key of the authorization server. The user then
3. attaches this very JWT to every sent request.
4. The authorization server then verifies whether the JWT was issued by this authorization server and if it was tampered by someone by verifying its signature with the public key.

https://stackoverflow.com/questions/60538047/jwt-private-public-key-confusion#comment107100113_60538047

서명 생성(암호화) 과정: 해싱을 먼저 적용하고 이후에 키로 암호화
서명 검증 과정: 받은 JWT를 키로 복호화를 한 후 해싱된 값을 만들어내서 비교하는 것

대칭키를 통한 JWT 검증

ex. HS256
You send your JWT to the server with each request. When the server receives it, it generates a signature using some data from your JWT, verifies it, and if your JWT is valid, it sends back a response.

When your authentication server receives an incoming JWT, it uses the incoming JWT's header and payload segments and the shared private key to generate a signature.
→ 생성한 서명과 incoming JWT의 서명이 같다면 검증 완료

중앙집중monolithic 서버 시스템에서는 상관없지만 분산distributed 시스템에서는 여러 서버에서 개인키를 모두 가지고 있어야하는 문제점이 발생함

  • 개인키를 여러 서버가 모두 가지고있다면 너무 위험하고
  • 요청을 받은 서버가 토큰을 인증서버에 전달해서 검증을 해야함

https://www.freecodecamp.org/news/how-to-sign-and-validate-json-web-tokens/

비대칭키를 통한 JWT 검증

ex. RS256
On the resource server we can validate the token by using the public key.

결국 검증을 공개키를 통해서 하는 게 맞다
해싱을 사용했으니 그다음엔 또 서명을 만들어내서 비교하겠지만 서버가 공개키를 가지고 있단 사실이 지금 나에겐 너무나 중요함
공개키는 JWT 웹사이트에 공개되어있으므로 요청이 인증서버로 가지 않아도 다른 서버들에서도 자체적으로 검증후 응답해줄 수 있다
https://medium.com/dataseries/public-claims-and-how-to-validate-a-jwt-1d6c81823826

프로그래머스 문제풀기

➡️ 명예의 전당(1)

def solution(k, score):
    ans=[]
    for i in range(len(score)):
        if i>=k:
            ans.append(sorted(score[:i+1],reverse=True)[k-1])
        else:
            ans.append(sorted(score[:i+1],reverse=True)[i])
    return ans

이게 오래 걸리는 문제에서 시간이 너무 오래 걸렸다
테스트 15 〉 통과 (35.63ms, 10.2MB)
테스트 16 〉 통과 (35.55ms, 10.3MB)
테스트 17 〉 통과 (37.13ms, 10.4MB)
테스트 18 〉 통과 (35.73ms, 10.3MB)
테스트 19 〉 통과 (35.35ms, 10.5MB)
테스트 20 〉 통과 (35.58ms, 10.3MB)
테스트 21 〉 통과 (33.63ms, 10.4MB)
테스트 22 〉 통과 (33.58ms, 10.4MB)
테스트 23 〉 통과 (35.25ms, 10.3MB)
테스트 24 〉 통과 (34.64ms, 10.3MB)
테스트 25 〉 통과 (34.32ms, 10.3MB)

그래서 리스트 축약식으로 바꿔봤는데 별 차이 없었고
ans의 마지막 값과 비교하는 조건문을 추가했더니

def solution(k, score):
    ans=[]
    for i in range(len(score)):
        if i>=k:
            if ans[-1]<score[i]:
                ans.append(sorted(score[:i+1],reverse=True)[k-1])
            else:
                ans.append(ans[-1])
        else:
            ans.append(sorted(score[:i+1],reverse=True)[i])
    return ans

테스트 15 〉 통과 (7.57ms, 10.5MB)
테스트 16 〉 통과 (7.08ms, 10.2MB)
테스트 17 〉 통과 (6.43ms, 10.4MB)
테스트 18 〉 통과 (7.11ms, 10.3MB)

이 부분이 오래 걸리고 나머지는 괜찮아졌다
조건을 잘 설정하는 게 중요한 것 같은데 이 모든 조건을 함축적으로 가지고 있으면 더 좋겠지..?

리스트 축약식

🛸변수 각각에 대해서 범위 설정해주기

[i * j for j in range(2, 10) 
	   for i in range(1, 10)]

→ 이때 for문의 실행 순서는 뒤 > 앞

🛸리스트 축약식에서 조건문의 위치

  • if만 있을 때
[x for x in range(n) if condition ]
  • else까지 있을 때
[x if condition else y for x in range(n) ]
  • if만 여러개 있을 때
[n for n in range(1,31) if n % 2 == 0 if n % 3 if n % 5 == 0]

if 를 and로 연결한 것 과 같이 연산됨
예시에서 2,3,5의 공배수를 구함

profile
looooggi

0개의 댓글