CS & 알고리즘 스터디: 여섯 번째 스터디
여섯 번째 스터디
이번 주는 네트워크 부분의 시작이다. 지난 주에 언급하였듯이 분량을 꽤나 축소했다. 날씨도 더워져 퍼질 수도 있을 것 같아 이번에 적절하게 밸런스를 잡은 것 같다. 무엇보다, 이번 주는 스터디원들의 사정 상 목요일에 하기 때문에 오히려 지난 번과 분량이 같았으면 시간관리가 되지 않았을 것 같다!
키워드
쿠키와 세션
Q: 쿠키와 세션의 차이에 대해 설명해주세요.
A:
우선, 쿠키와 세션은 웹 개발에서 상태 정보를 관리하는 데 사용되는 두 가지 기법이다.
쿠키
특징:
- 클라이언트에 저장된다.
- 생성 시 설정된 만료 날짜까지 유지되며, 이후에는 자동으로 삭제된다.
- 4KB로 제한된다.
- 클라이언트에 저장되는 관계로 보안에 취약하다.
- 사용자의 로그인상태 또는 설정을 유지하는 데에 사용된다.
- HTTP 헤더를 통해 서버와 주고받는다.
동작:
- 클라이언트가 페이지를 요청한다.
- 웹 서버는 쿠키를 생성한다.
- 서버는 생성한 쿠키에 정보를 담아 컨텐츠와 함께 클라이언트에 전달한다.
- 클라이언트는 해당 쿠키를 가지고 있다가 서버로 다시 요청을 보낼때 요청과 함께 전송한다.
세션
특징:
- 서버에 저장된다.
- 서버에서 설정한 시간동안 유지된다.
- 크기 제한이 없다.
- 서버에 저장됨으로 상대적으로 안전하다. 클라이언트에는 세션 ID만 저장된다.
- 로그인 정보, 장바구니, 온라인 상태 등을 저장한다.
- 클라이언트는 서버로 세션 ID를 전송하며, 이를 사용하여 세션 데이터를 조회한다.
동작:
- 클라이언트가 페이지를 요청한다.
- 웹 서버는 요청 헤더를 확인하여 클라이언트가 세션 ID를 보냈는지 확인한다.
- 존재하지 않는다면 이를 생성하여 클라이언트로 전달한다.
- 클라이언트는 받은 세션 ID를 쿠키에 저장하여 이후의 요청에 서버로 전달한다.
Q: 세션 방식의 로그인 과정에 대해 설명해주세요.
A:
- 클라이언트는 POST 요청으로 로그인 요청을 보낸다. 이 때 해시된 비밀번호를 함께 전달한다.
- 서버는 받은 정보를 데이터베이스에 대조하여 검증한다.
- 인증이 성공적으로 끝나면 새 세션을 생성하고 ID를 부여한다.
- 서버는 세션 ID와 관련된 정보를 세션 저장소에 저장한 후 클라이언트로 세션 ID를 돌려준다.
Q: HTTP의 특성인 Stateless에 대해 설명해주세요
A:
HTTP의 Stateless(비상태성) 특성은 각 요청이 서로 독립적이며, 서버가 이전 요청의 상태를 기억하지 않는다는 것을 의미한다.
이로 인해 사용자가 웹 페이지를 로드하는 일련의 과정을 거쳐도 서버는 각 요청을 별개로 처리하며 이전 요청에 대한 정보를 참조하지 않는다. 상태를 유지해야 하는 필요성이 야기되면 쿠키나 세션 등의 별도 상태관리 메커니즘을 사용해야 한다.
그렇다면 왜 HTTP는 비상태성이라는 특성을 가져야 하는가?
비상태성은 서버가 각 요청을 독립적으로 처리할 수 있게 하여 서버 설계를 간단하게 해주며, 여러 서버가 동일한 클라이언트 요청을 처리할 수 있도록 해주어 서버 확장을 용이하게 해준다.
HTTP
Q: 공개키와 대칭키에 대해 설명해주세요.
A:
보안에는 키라는 개념이 있다. 키를 사용하여 평문을 암호문으로 암호화하고 키를 사용해 암호문을 평문으로 디코딩한다.
대칭키 방식은 인코딩과 디코딩에 같은 암호 키가 사용되며, 데이터를 암호화하기 위한 연산이 빨라 대용량 데이터 암호화에 적합하다. 다만, 같은 키가 인코딩과 디코딩에 모두 사용되기 때문에 사전에 키를 공유해야 하며, 이 과정에서 키가 탈취당할 수 있다는 단점이 있다.
공개키를 사용하여 암호화할 때는 인코딩과 디코딩에 사용되는 키가 서로 다르며, 공개키와 개인키 두 개의 키를 사용한다. 공개키는 누구나 접근이 가능하며, 개인키는 함께 생성되는 키쌍으로, 절대 노출되어서는 안된다. 암호화에 공개키가 사용되고 개인키로 이를 복호화 한다면 데이터 보안의 효과를 가지며, 반대로 암복호화를 한다면 전자 서명의 기능을 갖는다.
Q: SSL과 TLS의 차이는 무엇인가요?
A:
SSL이란 Secure Socket Layer의 약자로, 웹사이트의 ID를 인장하고 암호화된 연결을 생성하는 인터넷 보안 프로토콜이다. SSL인증서는 종종 디지털 인증서로 불리며, 클라이언트와 서버 사이에 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위해 사용되는 기술이다. SSL을 적용하면 개인 데이터 또는 금융 데이터 등의 민감한 정보가 훔쳐지는 것을 방지할 수 있다.
TLS는 Transport Layer Security의 약자로, SSL의 향상된 버전이다. SSL은 현 시점에서 권장되지 않는 알고리즘과 약한 해시 함수를 사용한다. SSL에서 사용되는 취약한 암호화 알고리즘은 짧은 키 길이로 인해 공격에 쉽게 노출되었으며, 핸드셰이크 프로토콜 또한 충분한 보안 검증을 수행하지 않았다. 이에 반해 TLS는 키 교환 및 인증에 있어 더 많은 보안 옵션과 기능을 제공하여 SSL의 취약점을 매꿨다. 또한, 불필요한 라운드 트립 등을 제거하여 핸드셰이크 과정 역시 간소화되어 더 빠른 연결을 가능케했다.
Q: HTTP 메소드에 대해 설명해주세요.
A:
HTTP 메서드란 클라이언트-서버 구조에서 클라이언트가 서버에 요청을 할 때 사용하는 다양한 종류의 요청이다.
HTTP 메서드를 사용하면 요청의 의도가 명확해지며, 전 서계적으로 표준화된 방식으로 정의되어 있기 떄문에 다양한 클라이언트와 서버간 상호 호환된다.
각 메서드는 특정한 작업을 수행하며, 주요 메서드로는 GET, POST, PUT, DELETE, PATCH 등이 있다.
GET
서버에서 데이터를 가져오는 데 사용되며, 데이터를 조작하지 않는다. 반복 호출 시에도 항상 같은 결과를 반환한다.POST 서버에 데이터를 제출하여 새로운 리소스를 생성하거나, 서버에서 처리가 필요할 때 사용된다.
PUT
서버에 이미 존재하는 리소스에 대해 대체 또는 업데이트를 해야할 때 사용된다.DELETE
서버의 리소스를 삭제할 때 사용된다.
PATCH는 PUT과 비슷하다.
Q: HTTP메소드의 멱등성에 대해 설명해주세요.
A:
HTTP 멱등성이란 동일한 요청을 여러 번 보내도 서버의 상태가 동일하게 유지되는 성질을 말한다.
첫 메서드 호출 전과 같은 상태가 아닌, 멱등성 메서드를 여러 번 호출해도 최초 호출과 동일한 상태로 유지되는 성질이기에 PUT과 PATCH, DELETE 역시 멱등성 메서드이다.
Q: GET과 POST의 차이는 무엇인가요?
A:
GET 요청은 말 그대로 서버로부터 무언가를 가져오는 데 사용되는 HTTP 메서드이다. 데이터는 일반적으로 URL의 쿼리 스트링에 포함되어 전송되며, 이 떄문에 주소창에 쉽게 보이고 북마크가 가능하다. 추가적으로, URL을 통해 전송되는 방식 때문에 캐싱이 가능하며 반복 요청 시 캐시된 데이터를 사용하여 서버 요청을 줄일 수 있다. 여러 번 요청해도 매 번 같은 것을 반환하기에 멱등성이 보장된다.
예: https://example.com/search?q=keyword
POST요청은 HTTP 요청 본문에 포함되어 전송된다. 이 때문에 민감한 정보가 URL에 그대로 노출되지 않으며, 전송할 수 있는 데이터 크기에 제한이 없다. 다만, 본문 데이터 또한 네트워크를 통해 전송되는 것이기 때문에 현대에서 이에 대한 암호화는 필수적이다. 동일한 POST요청을 여러 번 보낼 경우에 서버의 상태는 변경될 수 있다. 같은 폼을 여러 번 제출하는 것이 그러한 예시 중에 하나인데, 여러 번의 제출로 인해 중복 데이터가 발생할 수 있음으로 멱등성 메서드가 아니다.
문제풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def dp(k, coins):
cache = [0] * (k+1)
cache[0] = 1
for coin in coins:
for i in range(coin, k+1):
cache[i] += cache[i-coin]
return cache[k]
n, k = map(int, input().split())
coins = []
for _ in range(n):
coins.append(int(input()))
coins.sort()
print(dp(k, coins))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import sys
from collections import deque
input = sys.stdin.readline
dy = [-1,0,1,0]
dx = [0,1,0,-1]
def bfs(x, y, height, visited, land):
N = len(land)
queue = deque([(x, y)])
visited[x][y] = 1
while queue:
cx, cy = queue.popleft()
for i in range(4):
nx, ny = cx + dx[i], cy + dy[i]
if 0 <= nx < N and 0<= ny < N and not visited[nx][ny] and land[nx][ny] > height:
visited[nx][ny] = 1
queue.append((nx, ny))
if __name__ == "__main__":
N = int(input())
land = [list(map(int, input().split())) for _ in range(N)]
min_water = min(map(min, land))
max_water = max(map(max, land))
max_lands = 1
for height in range(min_water, max_water+1):
visited = [[0]*N for _ in range(N)]
safe_lands = 0
for i in range(N):
for j in range(N):
if land[i][j] > height and not visited[i][j]:
bfs(i, j, height, visited, land)
safe_lands += 1
max_lands = max(max_lands, safe_lands)
print(max_lands)