CSRF 란?

Cross-Site Request Forgery의 줄임말로 HTML 안에 또 다른 HTML 코드를 넣어 사용자가 의도하지 않은 동작을 하도록 만드는 공격방법으로 사용자의 쿠키 등 정보를 훔쳐가는 등 사이트와 서버간 요청시 들어와 불법적인 행동을 수행한다.

 

{% csrf_token %} 를 사용하여 방지할 수 있다.

 

CSRF 토큰은 서버와 클라이언트 간에서 사용 방식

서버는 세션에 CSRF 토큰을 집어넣고 웹 페이지를 생성할 때 CSRF 토큰을 포함시킵니다. 사용자가 액션을 수행할 때 이 CSRF 토큰을 요청과 함께 전송하면 서버에서 일치하는지 확인합니다. 이때 일치하지 않는다면 해당 접근을 공격으로 인식하고 요청을 거절합니다.

 

토큰이 발급되는 위치

CSRF 토큰은 서버 측에서 생성되어 템플릿을 통해 클라이언트로 전달됩니다.

주로 템플릿을 통해 폼에 포함되거나 AJAX 요청의 헤더에 추가되어 클라이언트와 서버 간의 요청의 안전성을 확보합니다.

 

1. 템플릿을 통해 폼에 포함되는 경우

  1. form 에서 request.method 가 post 일때 넣어줍니다.

2. js ajax에서 POST를 통해 보내는 경우에 요청 헤더에 포함시키는 경우

// jQuery를 사용하는 예시
$.ajax({
    url: '/some-url/',
    type: 'post',
    headers: {
        'X-CSRFToken': '{{ csrf_token }}'
    },
    data: { /* 요청 데이터 */ },
    success: function(response) {
        // 응답 처리
    }
})

'Development > WEB' 카테고리의 다른 글

캐시,세션,쿠키  (0) 2023.08.11
HTTP, HTTPS  (0) 2023.08.11

배경

상태/정보 확인을 위해 항상 HTTP 요청을 보내는 경우 문제 발생

  • 서버의 부하가 커지고 응답시간이 증가하는 등의 성능저하가 일어나 비용이 증가하고 UX 도 저하된다.

=> 쿠키, 세션, 캐시 사용으로 문제 해결

 

캐시

  • 저장위치: 클라이언트
  • 데이터 크기: 제한 있음
  • 보안성: 클라이언트에서 접근 가능 (보안성 낮음)
  • 유효 기간: 캐시의 유효기간에 따름
  • 사용 목적: 성능 향상 및 대역폭 절약 (ex.이미지,css,js 파일 등)

세션

  • 저장위치: 서버
  • 데이터 크기: 제한 없음
  • 보안성: 클라이언트에서 직접 접근 불가 (보안성 높음)
  • 유효 기간: 세션 종료 시 삭제
  • 사용 목적: 상태 유지 및 사용자 인증 (ex. 로그인 유지)

쿠키

  • 저장위치: 클라이언트
  • 데이터 크기: 제한 있음
  • 보안성: 클라이언트에서 접근 가능 (보안성 낮음)
  • 유효 기간: 쿠키의 만료기간에 따름
  • 사용 목적: 상태 유지 개인화

※  오류 코드

5xx 대의 오류 : 서버의 문제

4xx 대의 오류 : 클라이언트 쪽의 문제

1xx 대의 오류  : 처리중이거나 추가 정보를 요청하는 경우

3xx 대의 오류 : 요청 완료에 추가적인 조치가 필요하거나 리다이렉션 하는 경우

'Development > WEB' 카테고리의 다른 글

CSRF  (0) 2023.08.21
HTTP, HTTPS  (0) 2023.08.11

HTTP(HyperText Transfer Protocol)

HTTP 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트-서버 프로토콜이다.

웹에서 데이터를 주고 받을 때, 파일을 서버에서 다운 받을 때, API를 요청할 때 등 사용된다.

 

HTTP의 주요 메서드

  • GET - 리소스를 요청하고 정보를 조회하는 데 주로 사용
  • PUT - 서버에 데이터를 업로드하거나 업데이트 할 때 사용
  • POST - 서버에 데이터를 생성할 때 사용
  • DELETE - 서버의 데이터를 삭제할 때 사용

GET vs POST

GET

  • 쿼리 스트링을 사용하여 데이터를 전송
  • url 길이 제한이 있어 데이터 전송량이 제한될 수 있음
  • url 형식 : http://localhost:8000/login?id=admin&pw=1004

POST

  • body 문에 데이터를 포함시켜 전송
  • url 길이 제한이 없음(다양한 형식의 데이터 포함 가능)
  • url 형식 : http://localhost:8000/login

=> GET 방식의 경우 url 정보가 담기기 때문에 민감한 정보의 경우 POST 방식을 사용하는 것이 좋음

HTTPS

웹 브라우저와 웹 사이트 간에 데이터를 전송하는 데 사용되는 기본 프로토콜인 HTTP보안 버전

 

HTTPS 사용 프로토콜

Secure Socket Layer / SSL

- SSL 웹사이트와 브라우저 사이(또는 서버 사이) 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위한 표준 기술

 

Transfer Layer Security / TLS

- SSL 향상된 더욱 안전한 버전

- 보안강화 목적으로 암호화,신원인증,데이터 위조변위 여부확인 목적으로 사용

 

즉, HTTPS는 HTTP 프로토콜 상위에서 TLS 암호화를 구현한 것

 

 

'Development > WEB' 카테고리의 다른 글

CSRF  (0) 2023.08.21
캐시,세션,쿠키  (0) 2023.08.11

DFS(Depth-First Search)

깊이를 우선하여 탐색하는 방법으로 하나의 경로를 끝까지 탐색한 후, 돌아와서 다른 경로를 탐색한다.

스택(Stack)이나 재귀 함수를 사용하여 구현할 수 있다.

 

장점

  1. 구현이 비교적 간단하다 (스택, 재귀 함수를 사용하여 구현)
  2. 메모리 사용량이 적다. DFS는 스택을 사용하여 탐색 경로를 저장하므로, 메모리 적은 편이다. (탐색 경로에 대한 정보만 필요)
  3. 최단 경로를 찾을 때 유용하다. 탐색 중에 목표 지점에 도달하면 탐색을 종료할 수 있기 때문

단점

  1. 무한 루프의 위험성 :  그래프에 순환 경로가 있는 경우, DFS는 순환 경로를 계속해서 탐색하여 무한 루프에 빠질 수 있다.
  2. 최단 경로가 아닐 수 있다 : DFS는 깊이 우선으로 탐색하므로, 첫 번째로 발견한 해답이 최단 경로가 아닐 수도 있다.
  3. 탐색 시간이 길 수 있다 : 그래프가 깊거나 가지가 많은 경우, DFS는 탐색 시간이 길어질 수 있다.

BFS(Breadth-First Search)

너비를 우선하여 탐색하는 방법으로 한 단계씩 진행하면서 해당 단계의 모든 노드를 탐색한다.

큐(Queue)를 사용하여 구현할 수 있다.

 

장점

  1. 최단 경로를 찾을 수 있다 : 너비를 우선으로 탐색하므로, 시작점에서 가까운 노드부터 탐색하여 최단 경로를 찾을 수 있다.
  2. 구현이 비교적 간단하다. (큐(Queue)를 사용하여 구현)
  3. 한 단계씩 진행하면서 모든 이웃 노드를 탐색한 후에야 다음 단계로 진행한다. 단계별 정보를 활용하여 문제를 해결할 수 있다.

단점

  1. 메모리 사용량이 크게 증가할 수 있다 : BFS는 모든 이웃 노드를 큐에 저장해야 하므로, 탐색하는 그래프의 크기가 커질수록 큐의 크기도 커지고 메모리 사용량이 증가할 수 있다.
  2. 그래프가 깊거나 가지가 많은 경우 계산 시간이 길어질 수 있다.
  3. 그래프의 순환 구조에서 무한 루프에 빠질 수 있다.

'Development > Algorithm' 카테고리의 다른 글

이분탐색 (Binary Search)  (0) 2023.07.10
그리디 알고리즘  (0) 2023.06.30

이분 탐색(Binary Search)

:정렬된 배열에서 특정한 값을 효율적으로 찾는 탐색 알고리즘

 

정렬된 배열에서 중간 값을 선택하여 비교하고 중간 값 보다 작은 경우 왼쪽 부분 배열 대상으로 탐색, 큰 경우 오른쪽 부분 배열 대상으로 탐색하는 과정을 반복하여 특정 값을 찾도록 동작한다.

 

장점

  1. 빠른 탐색 속도: 이분 탐색은 탐색 범위를 반으로 나누면서 탐색을 수행하기 때문에, 평균적으로 O(log n)의 시간 복잡도를 가짐
  2. 간결하고 이해하기 쉬운 구현: 이분 탐색은 반복문 또는 재귀 함수를 사용하여 구현할 수 있으며, 구현이 간결하고 직관적

단점

  1. 정렬된 배열에서만 가능 : 탐색을 수행하기 전에 배열의 정렬을 확인하고 정렬 후 이분 탐색 사용이 가능
  2. 추가 메모리 공간 사용 :  탐색 범위를 축소하는 과정에서 추가 메모리 공간을 사용
  3. 원하는 값을 찾을 수 없는 경우 발생 : 배열에서 원하는 값을 찾을 수 없는 경우에 대한 고려 필요

활용

  1.  배열에서 특정 값을 찾는 경우
  2.  특정 값의 인덱스를 찾는 경우
  3.  최대.최소 값을 찾는 경우
  4.  특정 조건에 해당하는 값을 찾는 경우

시간복잡도

: O(log n)

 

<이분탐색 Python 코드 예시>

def binary_search(start,end,target,array):
    while start <= end:

        mid = (start+end) //2

        if array[mid] == target:
            return mid
        
        elif array[mid] > target:
            end = mid-1
        elif array[mid] < target:
            start = mid+1

 

 

'Development > Algorithm' 카테고리의 다른 글

DFS / BFS  (0) 2023.07.16
그리디 알고리즘  (0) 2023.06.30

#주석!!!

<!--주석-->

😎

 

코드를 분석하고 쉽게 이해하기 위해 주석을 사용하게 된다.

 

이러한 주석은 본인과 협력하는 개발자들을 위해 효율적으로 작성되어야 한다.

 

 

 

1. 코드의 목적과 의도를 담아 설명해야한다.

 

2. 코드의 단순 기능을 작성하는 것이 아닌 코드 작성에 대한 이유를 포함해야한다.

 

3. 제약조건 등을 포함하여 수정 시 참고할 수 있도록 한다.

 

4. 코드 변경 이력 내용을 주석에 포함하여 남기는 것도 협업을 하는 경우 도움이 될 수 있다.

 

5. 적절한 주석의 사용

-필요한 경우에만 핵심내용만 포함하여 간결하게 주석을 남기는 것이 효율적이다.

 

 

효율적이고 올바른 주석 사용을 통해 개발 업무 효율을 높이자!

'Development > IT' 카테고리의 다른 글

Chat GPT 확장 프로그램 사용  (0) 2023.04.07

그리디 알고리즘은 단순하지만 강력한 알고리즘이라고 할 수 있다.

 

어떤 문제가 주어졌을 때 현재 상황에서 가장 좋은 방식을 선택하는 알고리즘으로 단순 무식하다고 볼 수 있다.

 

그리디 알고리즘에 해당하는 문제 풀이시 현재 상황에서 최선의 선택을 하는 것의 정당성을 파악하는 것이 중요하다!

 

대표적인 예시로는 거스름돈 문제를 생각 해 볼 수 있다.

x만큼의 거스름돈을 돌려줘야하는 상황에 500원,100원,50원,10원 짜리의 동전 사용이 가능한 경우 그리디 알고리즘에서는 가장 큰 화폐 단위부터 돈을 거슬러 준다면 동전 개수를 최소화 하여 거슬러 줄 수 있게 되는 것이다.

 

[백준 그리디 알고리즘 예시 문제]

https://www.acmicpc.net/problem/11047

 

11047번: 동전 0

첫째 줄에 N과 K가 주어진다. (1 ≤ N ≤ 10, 1 ≤ K ≤ 100,000,000) 둘째 줄부터 N개의 줄에 동전의 가치 Ai가 오름차순으로 주어진다. (1 ≤ Ai ≤ 1,000,000, A1 = 1, i ≥ 2인 경우에 Ai는 Ai-1의 배수)

www.acmicpc.net

 

문제의 표현이 조금 달라 졌을 뿐 본질적인 문제는 위의 거스름돈 문제와 동일하다.

n,k= map(int,input().split())

coin = []   #화폐 단위를 입력받을 리스트
for i in range(n):
    n = int(input())
    coin.append(n)

coin.reverse()  #큰 단위 부터 체크하기 위해 내림차순으로 변경
cnt = 0     #필요한 동전 개수

for i in range(len(coin)):
    if k >=coin[i]:
        cnt += k //coin[i]
        k = k%coin[i]

print(cnt)

'Development > Algorithm' 카테고리의 다른 글

DFS / BFS  (0) 2023.07.16
이분탐색 (Binary Search)  (0) 2023.07.10

HTTP에서 method 속성 값으로 주로 사용되는 두 가지는 GET과 POST 입니다.

method 속성은 양식 데이터가 서버로 전송될 때 어떤 방식을 사용할지 결정하도록 합니다.

 

GET method

GET의 경우 데이터를 서버로 전송 시 URL의 쿼리 문자열에 데이터를 포함하여 전송하는 방식입니다.

주로 데이터를 서버에 요청하거나 검색 시 사용되며 URL에 데이터가 노출되어 보안이 취약한 특징이 있습니다.

<form action = "/end" method = "get">
	<!-- 내용 -->
	<input type="submit" value = "submit">
</form>

POST method

POST의 경우 데이터를 HTTP 요청 본문에 포함하여 서버로 전송하는 방식입니다.

주로 데이터를 서버에 제출하거나 변경 시 사용되며 URL에 데이터가 노출되지 않으므로 상대적으로 보안성이 더 높습니다.

추가적으로 GET과 달리 데이터 크기 제한이 없어 긴 데이터 전송이 가능합니다.

<form action = "/end" method = "post">
	<!-- 내용 -->
	<input type="submit" value = "submit">
</form>

 

즉 URL에 데이터 내용이 노출되는 경우 GET 메서드를 사용한 방식이라고 생각하고 데이터가 노출되지 않는 경우 POST 메서드를 사용한 방식으로 판단 할 수 있습니다.

Allocation of Frames

여러개의 프로세스에게 어떻게 page frame을 할당할 것인가?

SW 측면에서 loop 내의 page는 한꺼번에 allocate 되는 것이 유리하다. 

그렇지 않은 경우 매 loop 마다 page fault가 발생할 수 있다.

Fixed Allocation

- Equal allocation : 각 프로세스에게 동일한 개수의 frame을 할당하는 방식

- Proportional allocation : 각 프로세스의 크기에 비례하여 frame을 할당하는 방식

 

Priority Allocation

: 프로세스의 중요도를 기반으로 frame을 할당하는 방식

I/O 를 감소시켜 waiting 상태의 시간을 줄여 실행이 빨리 끝날 수 있다.

page fault가 발생하는 경우 낮은 우선순위 프로세스의 frame을 선택하여 교체하도록 한다.

 

*Global vs Local Replacement

Global Replacement : replacement frame을 전체 frame에서 선택하도록 한다. 하나의 프로세스는 다른 프로세스의 frame을 가져와 사용할 수 있다. 동적으로 관리할 수 있고 circular queue로 관리하는 경우 전체 시스템으로 하나로 관리 할 수 있다.

Local replacement : 각 프로세스는 해당 프로세스 내에서 frame을 선택할 수 있다.

 

Thrashing

- 프로세스가 충분한 page를 갖지 못한다면 page fault rate가 높아지고 이는 CPU utilization을 떨어트린다.

- 프로세스의 잦은 page swapping으로 CPU 성능이 떨어지는 상태

Locality

프로그램의 메모리는 임의 시간 내에 프로그램의 일부분을 집중적으로 참조하는 고도의 지역성을 갖는다.

시간 지역성 : 현재 참조된 메모리가 가까운 미래에도 참조될 가능성이 높음 (loop, subroutine, stack)

공간 지역성 : 하나의 메모리가 참조되면 주변의 메모리가 계속 참조될 가능성이 높음(Array Traversal, 명령의 순차 실행)

 

Locality를 어떻게 계산할 것인가? 

 

Working-Set Model

- 현재 시점의 지역성을 확인하기 위한 목적으로 사용되는 working-set window를 사용

- working-set window가 너무 작은 경우 지역성을 반영하지 못한다.

- 각 프로세스의 working-set size의 합은 사용가능한 전체 frame의 크기보다 크면 Thrashing 상태가 된다.

이때 , 프로세스는 suspend 되도록 한다.

- 매번 working-set을 계산하는 것은 cost가 많이 필요하다.

 

Page-Fault Frequency Scheme

적절한 Page fault의 상한선,하한선 기준을 정해 벗어나는 경우 조치하도록 한다.

상한선 보다 높아지는 경우 frame을 더 할당해주며 하한선 보다 낮아지는 경우 frame을 회수한다.

-> Working set 방식은 page 참조 시마다 페이지 집합을 수정하고 PFF 방식은 page fault 발생 시에만 페이지 집합을 수정하여 오버헤드를 상대적으로 줄인다.

 

Virtual Memory 의 장점 (프로세스 생성 시)

Copy-on-Write

부모와 자식 프로세스가 처음에는 같은 page를 공유하도록 하고 write를 하는 순간 page를 복사하고 복사한 page에 write 작업을 수행

기본적으로는 page를 공유하도록 하고 write 할 때 copy 하여 수행하도록 하여 메모리 사용 효율성을 높일 수 있다.

Memory-Mapped Files

프로세스의 가상 공간 중 일부를 디스크에 있는 파일의 블록에 매핑하는 방식이다.

기존의 system call 의 오버헤드를 줄일 수 있다. (I/O를 줄일 수 있다.)

즉, 디스크 파일의 일부와 매핑하여 file system을 통한 과정을 거치지 않아 속도가 빠르고 I/O 발생으로 인한 오버헤드가 줄어든다.

Prepaging

일반적으로 페이징 기법을 사용할 때 초기에는 page fault가 반드시 발생한다.

이러한 page fault를 줄이기 위해 Prepaging으로 미리 올려둬서 page fault 를 줄일 수 있다.

 

Page size

- Page size가 과도하게 큰 경우 Internal fragmentation이 발생 할 수 있다.

- Page size가 작은 경우 Page table size가 커질 수 있다.

- Page size가 커지면 locality를 정확히 구분하기 어렵다.

 

I/O Interlock

- page가 memory에서 lock 상태가 되어야 하는 경우가 필요하다.

예를들어 디스크에서 외부저장장치로의 이동을 위해 buffer에 있는 경우 page 교체가 일어나면 정상적으로 파일이동이 불가하다.

이러한 경우 page가 교체되지 않도록 보호해줄 필요가 있다.

'Development > OS(Operating System)' 카테고리의 다른 글

Virtual Memory(1)  (0) 2023.05.20
Deadlock  (0) 2023.05.09
Process Synchronization(2)  (0) 2023.04.08
Computer System Overview2  (0) 2023.04.01
Process Synchronization(1)  (0) 2023.03.30

Virtual Memory

: logical memory 와 physical memory를 분리

프로그램 실행을 위해서는 logical memory가 모두 physical memory에 올라와 있어야한다.

하지만 실제 주소 공간은 논리적 주소공간보다 작다.

효율적인 공간 사용을 위해 CPU 입장에서는 다 올린 것 처럼 보이도록 하고 실제로는 실행에 필요한 부분만 메모리에 올리는 방법이다.

 

Demand Paging

CPU가 접근하여 필요로 할 때 page를 memory에 올린다.

- I/O 발생이 줄어든다.

- 메모리 사용이 줄어든다.

- 응답 속도가 빨라진다.

 

vaild-invalid reference를 memory에 올리는 과정에 사용한다.

 

Lazy swapper

- page가 필요한 경우에만 swap을 한다. page를 다루기에 pager 이라고도 한다. 

 

Valid-Invalid Bit

Valid(v)

- 메모리에 있는 상태

Invalid

- illegal : 해당 프로세스의 주소 공간이 아닌 경우

- not-in-memory : 해당 페이지가 메모리에 업로드 되지 않은 경우

- obsolete : disk에서 업로드되었지만 실제 데이터가 updated 되어버린 경우

 

주소변환이 일어날 때 invalid 상태인 경우 "page fault" 라는 핸들러를 통해 다룬다.

valid-invalid bit 사용

Page Fault

invalid page에 대한 접근은 trap을 발생시킨다. (page fault trap)

 

[ page fault handler 처리 과정 ]

1. illegal reference인 경우 해당 프로세스를 중단한다.

2. memory에 없는 경우라면 빈 page frame을 찾는다. free frame이 없는 경우 replace 과정을 진행한다.

3. page를 해당 frame으로 읽어온다.

4. CPU가 프로세스에게 할당할 때 page fault trap은 종료된다.

5 . page fault를 발생시킨 명령어를 다시 재시작한다.

page fault 처리과정

Page replacement Algorithm

freeframe이 없는 경우 victim page를 선정하여 교체 과정을 진행해야 한다.

page fault를 최소화하여 replacement 과정이 이루어지도록 하는 것이 필요하다.

 

First-In-First-Out(FIFO) Algorithm

- frame에 먼저 들어온 순서대로 replace 과정을 진행하는 알고리즘이다.

- frame 개수가 늘어나는 경우 이론상 page fault가 줄어야 하지만 늘어나는 현상이 발생한다.(Belady's Anomaly)

FIFO Algorithm 예시

Optimal Algorithm

- 이론상 최적의 알고리즘으로 미래 예측이 가능해야한다. 실제로는 불가능하므로 다른 알고리즘 성능을 평가하기 위해 사용된다.

최적 알고리즘 예시

Least Recently Used Algorithm(LRU)

- 과거의 사용을 기반으로 미래를 예측한다는 의미

- 과거에 가장 적게 사용된 것은 미래에도 사용되지 않을것이라 판단하고 victim page로 선정한다.

- timestamp를 사용하여 각 page의 최근 사용시간을 확인하여 찾아낸다. -> timestamp(I/0) 와 최소값을 찾는 과정의 오버헤드가 크다!

LRU 예시

LRU Implementation Algorithms

: LRU의 timestamp 사용과 최솟값을 찾는 과정에 발생하는 오버헤드를 최소화하기 위해 사용하는 방식이다.

1) Counter implementation

- 정확한 시간은 필요없으니 상대적인 순서만 이용하기 위해 CPU counter를 사용하는 방식

2) Stack impementation

-double link 형식의 stack 구조를 사용하여 top에 최근 사용 page를 기록하는 방식 -> 자료구조 유지에 대한 오버헤드가 발생

 

LRU Approximation Algorithms

: 오버헤드를 최소화하며 LRU 처럼 동작하도록 하는 알고리즘

1) Reference bit

- 초기값을 0으로 설정하고 주기적으로 0으로 reset 해준다. (0인 경우 교체를 해준다.)

 

2) Additional-Reference-Bits Algorithm

- 주기적으로 오른쪽으로 한칸씩 이동해준다. bit 값이 큰 것이 사용이 많이 됨을 알 수 있다. -> 8비트 사용과 최솟값을 찾기 위한 오버헤드 발생

 

3) Second chance(clock) Algorithm

- 포인터를 사용하여 원형 큐를 사용한다.

- 포인터를 하나씩 이동하며 reference bit을 확인하고 1인 경우 0으로 바꾸고 0인 경우 replace를 한다.

- 기존의 자료구조,최솟값 찾는 알고리즘 등으로 인한 오버헤드가 사라진다.

- 원형구조로 사용되어 같은 reference bit가 0이어도 순서구분이 가능해진다.

clock 알고리즘 예시

 

'Development > OS(Operating System)' 카테고리의 다른 글

Virtual Memory(2)  (0) 2023.06.06
Deadlock  (0) 2023.05.09
Process Synchronization(2)  (0) 2023.04.08
Computer System Overview2  (0) 2023.04.01
Process Synchronization(1)  (0) 2023.03.30

+ Recent posts