분류 전체보기
[Network] 트랜스포트 계층 : 개요(Intro)
인터넷 5계층에서 애플리케이션 계층과 네트워크 계층 사이에 있는 '트랜트포트 계층'의 프로토콜에 대해서 알아보자 트랜스포트 계층 개요 트랜스포트 계층 프로토콜은 서로 다른 호스트에서 동작하는 애플리케이션 프로세스들 간의 논리적 통신을 제공한다. 논리적 통신은 애플리케이션의 관점에서 보면 프로세스들이 동작하는 다양한 호스트들이 직접 연결된 것처럼 보인다는 의미이다. 하지만 실제로 호스트들은 수많은 라우터와 다양한 형태의 물리 링크를 통해 연결된 지구상의 다른 지역에 있을 수 있다. 트랜스포트 계층 프로토콜은 네트워크 엣지에서 구현된다. 송신 측의 트랜스포트계층은 애플리케이션 프로세스로부터 받은 메시지를 세그먼트 패킷으로 변환한다. 세그먼트는 트랜스포트 계층의 헤더와 애플리케이션 계층의 메시지를 캡슐화 한 ..
[백준 3980] 선발 명단 (C++)
3980번: 선발 명단 각각의 테스트 케이스에 대해서, 모든 포지션의 선수를 채웠을 때, 능력치의 합의 최댓값을 한 줄에 하나씩 출력한다. 항상 하나 이상의 올바른 라인업을 만들 수 있다. www.acmicpc.net 백트래킹 인원수가 최대 11명이고 자신이 원하는 포지션 최대 5개 중 하나에 들어갈 수 있으므로 O(5^11 - @)의 시간복잡도가 가능하다고 생각한다. 포지션은 11개인데 11명의 선수가 원하는 포지션을 5개씩 가지고 있다면 중복되는 경우가 아주 많아서 백트래킹에서 걸러지게된다. 따라서 절대 O(5^11) 시간은 나올 수 없고 그보다 훨씬 적은 시간이 들 것으로 예상했다. 백트킹을 수행하면서 현재 선수가 원하는 포지션 중 하나에 들어갈 수 있다면 현재 선수의 스탯을 더하고 다음 선수로 넘..
[백준 1339] 단어수학 (C++)
1339번: 단어 수학 첫째 줄에 단어의 개수 N(1 ≤ N ≤ 10)이 주어진다. 둘째 줄부터 N개의 줄에 단어가 한 줄에 하나씩 주어진다. 단어는 알파벳 대문자로만 이루어져있다. 모든 단어에 포함되어 있는 알파벳은 최대 www.acmicpc.net 브루트 포스 - 순열 (연습) 7달 전에 그리디를 사용해서 풀었었는데 이번엔 백트래킹 완전탐색을 이용해서 풀었다. 모든 단어를 입력받고 단어에 사용된 알파벳(최대 10개)를 중복 없이 걸러내기 위해서 중복을 허용하지 않는 자료구조인 set을 사용했다. 10개의 알파벳에 9~0까지의 숫자를 매칭해주고 모두 매칭이 된 경우 (cnt == 알파벳의 개수) 최대 10개의 단어를 매핑테이블(table[27])을 이용해 모두 숫자로 바꾸고 각각을 더해주었다. 매칭은 ..
[백준 2529] 부등호 (C++)
2529번: 부등호 여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력 www.acmicpc.net 브루트 포스 - 순열 (연습) 어제 푼 카카오 2021 하반기 공채 1차 코테 4번문제 (양궁) 과 비슷한 문제이다. 정렬이 잘못되었다고 하는데 나는 아직도 어디가 틀렸는지 감이 오지않는다. 경험삼아 쳐본 코테 덕분에 나 자신을 돌아보고 실력이 얼마나 부족한지 다시 생각해보는 계기가 되었다. 지금까지 하고싶은 알고리즘 공부, 재밌어보이는 문제, 내가 자신있는 파트의 문제 위주로 풀었고 자기 만족을 위해서 알고리즘 문제를 풀어왔다면, 남은 1년은 시험 공부하는 ..
[Network] 인터넷 프로토콜 계층과 캡슐화
인터넷은 매우 복잡하다. 하지만 이렇게 복잡한 인터넷 네트워크 구조도 결국 조직화 되었다. 우리가 이용하는 항공 시스템을 생각해보자. 비행기에 수하물을 보내서 이동시키는 과정은 다음과 같다. 네트워크에서 우리가 전송하려는 메시지를 수하물이라고 생각하면 될 것 같다. 수하물을 공항에서 검사 후 비행기에 태운다. == 호스트에서 데이터를 접속 네트워크에 보낸다. 비행기가 이륙한다. == 데이터가 통신 링크를 통해서 다음 라우팅 지점으로 향한다. 비행기가 관제탑의 지시를 받아 방향을 전환 한다. == 데이터의 헤더에 있는 정보를 통해서 라우터는 데이터의 다음 링크를 정해준다. 비행기가 착륙해서 수하물을 내려준다. == 도착지 호스트가 데이터를 받는다. 위와 같이 우리가 사용하는 시스템이 네트워크에도 비슷하게 ..
[Network] 네트워크 코어
[Network] 인터넷이란? Intro 인터넷은 전 세계적으로 수십억 개의 컴퓨팅 장치를 연결하는 컴퓨터 네트워크이다. 네트워크 가장자리 인터넷의 모든 장치(데스크톱 PC, 리눅스 서버, 스마트폰, 태플릿, TV, 게임 콘솔 등)은 호 hyeo-noo.tistory.com 지난 포스팅에서 인터넷의 가장자리를 살펴보았으므로 이제 네트워크 코어, 즉 인터넷의 종단 시스템을 연결하는 패킷 스위치들과 링크들의 연결망을 좀 더 자세히 알아보자. 네트워크 코어 호스트에서 호스트로 데이터를 전송하기 위해서 중간의 라우터들이 데이터를 전달 해 주어야 하는데 특정 라우터에서 다음 라우터로 데이터를 포워딩 해주는 기능이 코어 네트워크의 주 기능이다. 특정 패킷이 코어에 있는 라우터에 도달하게 되면 패킷에 담겨져 있는 목..
[Network] 인터넷이란? Intro
인터넷은 전 세계적으로 수십억 개의 컴퓨팅 장치를 연결하는 컴퓨터 네트워크이다. 네트워크 가장자리 인터넷의 모든 장치(데스크톱 PC, 리눅스 서버, 스마트폰, 태플릿, TV, 게임 콘솔 등)은 호스트 혹은 종단 시스템이라고 불린다. 데이터 전송 기초 종단 시스템은 통신 링크와 패킷 스위치가 있는 네트워크로 연결된다. 통신 링크에서는 다양한 전송률을 이용해서 패킷을 전송한다. 전송할 데이터가 만들어지면 종단 시스템에서 해당 데이터를 세그먼트로 나누고, 각 세그먼트에 헤더를 붙인다. 이렇게 만들어진 정보는 '패킷' 이라고 불리며 목적지까지 전송된다. 패킷 스위치는 라우터와 링크 계층 스위치를 가장 널리 사용한다. 스위치는 최종 목적지 방향에 있는 통신 링크로 패킷을 전달한다. 링크 계층 스위치는 보통 엑세스..
[Security] XSS(Cross Site Scripting) 취약점 Django
웹 개발을 하면 절대 무시할 수 없는 XSS, CSRF 등과 같은 보안 문제가 존재한다. 하지만 이들은 공격 방법에 대한 원리가 워낙 잘 알려졌고, 따라서 이에 대한 해결책도 쉽게 찾아볼 수 있다. 먼저 XSS의 원리와 공격 방법을 알아보고 해결방안을 유추해 본 다음 유추한 내용이 맞는지도 확인해보자. XSS(Cross Site Scripting) 특정 웹 사이트에 임의의 스크립트를 삽입해서 공격하는 방법이다. 주로 사용자의 입력 데이터를 검증하지 않을 때 발생하게 된다. 주로 사이트의 게시판과 관련된 보안 취약점이다. 사이트의 사용자를 주로 공격하고, 스크립트 실행을 통한 유저 정보 탈취가 주 목적이다. 어떤 공격을 하는가? 스크립트가 포함된 게시글을 열람 시 유저가 원치않는 스크립트를 실행하게 한다...
[Django] Google 소셜 로그인 (OAuth2.0)
DRF(Django REST Framework)를 사용해서 Google계정으로 회원가입, 로그인을 하는 방법을 알아보자. 최종 수정 : 2022/06/08 (OAuth2.0 흐름 수정) Google API 등록 Google Cloud Platform 하나의 계정으로 모든 Google 서비스를 Google Cloud Platform을 사용하려면 로그인하세요. accounts.google.com 1. 접속 후 새 프로젝트 생성 2. 사용자 인증정보 만들기 윗 부분의 + 사용자 인증 정보 만들기 클릭 OAuth 클라이언트 ID 클릭 3. OAuth 동의 * 표시된 항목을 적는다. 도메인을 설정해준다 = 사용할 url을 적어준다. 4. 클라이언트 ID확인 및 Callback uri 설정 위에서 했듯이 좌측 사용..
[Java] Call by Reference? Call by Value!
Java에서 Call by value와 Call by reference를 구분하는 방법은 매서드의 매개변수의 자료형에 달려있다. Java에서는 개발자가 포인터를 사용할 수 없도록 되어있다. 그래서 바꾸길 원하는 값의 주솟값을 넘길 수 없다. 아래 코드를 보자class Number{ public void increase(int count){ count++; }}public class Main { int count = 0; public static void main(String[] args){ Main mainNumber = new Main(); Number newNumber = new Number(); newNumber.increas..