Form

  • 페이지 요청시 전달되는 파라미터들을 쉽게 관리하기 위해 사용하는 클래스.
  • 필수 파라미터의 값이 누락되지 않았는지 확인
  • 파라미터의 형식은 적절한지 등을 검증

   

    일반 폼(forms.Form)

    모델 폼(forms.ModelForm) : 연결된 모델의 데이터를 저장. Meta 클래스가 필요.

 

form.py 생성하기

from django import forms
from .models import Product


class ProductForm(forms.ModelForm):
    class Meta:
        # Product 모델과 연결
        model = Product
        fields = ['product_name', 'price', 'desc']

 

views.py

def product_create(request):
    if request.method == 'GET':
        form = ProductForm()
        return render(request, 'mall.html', {'form': form})
    elif request.method == 'POST':
        form = ProductForm(request.POST)
        # 유효성 검사에 실패하면 다시 상품등록 페이지로 이동
        if form.is_valid():
            # 임시저장
            product = form.save(commit=False)
            product.user = request.user
            product.save()
            return redirect('/')

 

 

mall.html

    action 속성을 지정하지 않아도 현재 URL이 디폴트로 설정된다.

{% extends 'base.html' %}
{% block content %}
<div class="container">
    <form method="post">
        {% csrf_token %}
        <!--html 자동생성-->
        {{ form.as_p }}
        <button type="submit" class="btn btn-primary">저장하기</button>
    </form>
</div>
{% endblock %}

 

 

 

 

폼 위젯

 

form.py

from django import forms
from .models import Product


class ProductForm(forms.ModelForm):
    class Meta:
        model = Product
        fields = ['product_name', 'price', 'desc']
        widgets = {
            'product_name': forms.TextInput(attrs={'class': '클래스명'}),
            'price': forms.TextInput(attrs={'class': '클래스명'}),
            'desc': forms.Textarea(attrs={'class': '클래스명'}),
        }
        # 다음과 같이 레이블명도 설정할 수 있다.
        labels = {
            'product_name': '상품명',
            'price': '가격',
            'desc': '상품 설명',
        }

 

 

 

 

https://docs.djangoproject.com/en/4.0/topics/forms/

 

 

 

'Python > Django' 카테고리의 다른 글

[DRF] 01. 시리얼라이즈  (0) 2023.04.24
11. Django gitignore, 시크릿 키  (0) 2023.04.24
[DRF] 00.이론  (0) 2023.04.18
09. Django 템플릿 상속  (0) 2023.04.17
08. Django css  (0) 2023.04.17

 현재도 사용되는 레이아웃

  • CSS 레이아웃 : float, position을 사용. 모바일을 통한 멀티 스크린에 대응하는 디자인을 만들기에 적합하지 않음
  • Flexbox 레이아웃 : (1차원) x축 y축 방향으로 요소를 배치. 그리드 프레임 워크 Bootstrap에서 사용하는 기반의 기술
  • Grid 레이아웃 :  (2차원)행/열 격자 구조에 요소를 자유롭게 배치. 반응형 웹 레이아웃에 대응.

 

 

Grid

  • 2차원 배열(세로 열, 가로 행)의 레이아웃
  • 가로, 세로 정렬이 모두 필요한 경우 사용
  • IE 10, 11등은 부분 지원. 이때문에 크로스 브라우징을 해야 할 수 있음

 

 

grid-template

  • grid-template-row : 행의 형태를 정의(세로)
  • grid-template-column : 열의 형태를 정의(가로)
ROW(행)
Column(열)    
   
   

 

 

 

간격 정의

 

gap : row-gap    column-gap

    ex) gap : 10px 20px;

Grid Gutters : 로우, 컬럼 사이의 간격. grid-gap 속성으로 제어

 


사용 예시

 #grid { 
 	display:grid; 
    grid-template-rows: 300px 1fr auto; 
    grid-template-columns : repeat(3, 1fr 2fr);
    gap: 10px;
 }

 

 

 

 

아이템의 크기 설정

.area-a {
    /* row 첫 줄부터 마지막 줄 전부 */
    grid-row: 1 / -1;
    /* column 1번째 줄부터 5칸의 영역을 차지 */
    grid-column: 1 / span 5;
}

.area-b {
    grid-row: 1 / 4;
    /* column 첫 줄부터 5번째 줄까지 */
    grid-column-start: 1;
    grid-column-end: 5;
}

 

minmax(최소크기, 최대크기) : 최대값에만 fr을 쓸 수 있다.

    +) 컨테이너의 크기를 %로 줄 수 있다

grid-auto-rows(columns) : 크기 미리 주기

 

 

 

 

 

 

이름으로 크기 지정

grid-area : item에 이름 붙이기

grid-template-areas : 이름 붙인 것으로 영역 지정

 

<body>
    <div class="wrap">
        <div class="red"></div>
        <div class="blue"></div>
        <div class="green"></div>
    </div>
</body>
.wrap {
    display: grid;
    background-color: black;
    width: 500px;
    height: 500px;
    grid-template-areas:
        "red blue blue"
        /* . 은 빈칸으로 둔다 */
        "red . green";
}

.red {
    grid-area: red;
    background-color: red;
}

.blue {
    grid-area: blue;
    background-color: blue;
}

.green {
    grid-area: green;
    background-color: green;
}

 

 

 

 

transition

    속성 값의 변화를 일정 기간에 걸쳐 일어나게 하는 것

  • property : 어떤 transition에 대해 속성을 적용할지
  • duration : transition 발생하는 지속 기간
  • timing-function : 베지어 곡선 모델로 어떤 속도를 표현할 지
  • delay : transition 얼마나 기다릴 것인지(초단위)

 

transform 

    요소를 변형시킴

  • translate : 이동
  • scale : 확대, 축소
  • rotate : 회전
  • skew : 기울이기

 

 

 

 

 

 

+) 가짜 이미지 삽입시 사용할 사이트

https://picsum.photos/

 

id/<int:id>/width/height/

https://picsum.photos/id/2/200/300

'css' 카테고리의 다른 글

[CSS] display  (0) 2023.04.22
[CSS] Flexbox  (0) 2023.03.17
[CSS] position  (0) 2023.03.16
HTML와 CSS  (0) 2023.02.27

Display

 

 

바깥쪽

block inline
무조건 한 줄을 차지 기본적으로 컨텐츠 영역만큼만 차지
width, height, margin, paddin 지정 가능 1. width, height 지정 불가능
2. margin 좌우만 적용
3. padding : 시작적 영역 - 상하좌우, 실제 영역 - 좌우
<div>, <h1~6>, <header> 등 <span>, <a>, <button> 등

 

 

 

DOM (Document Object Model)

  • 웹 문서를 객체로 만든 인터페이스 모델

         ex) A 태그

                └ (아래) B 태그

                        └ (아래) C 태그     객체로 옮겨놓은 인터페이스

  • 자바스크립트 등으로 수정할 수 있는 API 제공 (ex. getElementById, querySelector)
  • 자바스크립트가 읽고 조작할 수 있는 객체의 형태로 HTML 문서를 바꾼 것

 

 

 

Event 

    사용자의 동작 같은 걸로 발생한 것

    ex) onclick, hover 등

 

 

 

 

overflow

    요소 내부의 컨텐츠들이 요소를 감싸고 있는 영역보다 커졌을 때 어떻게 나타낼 것인가?

    보통 컨테이너의 높이를 설정하거나 white-space를 nowarp으로 설정

  • visible
  • hidden
  • clip
  • scroll : 영역을 넘어가지 않아도 무조건 스크롤을 보여줌
  • auto : 브라우저가 결정. 영역 안이면 visible, 넘어가면 scroll

 

 

 

+) 안쪽

 

flex, grid, table, flow-root, flow, ruby 등

'css' 카테고리의 다른 글

[CSS] Grid  (0) 2023.04.23
[CSS] Flexbox  (0) 2023.03.17
[CSS] position  (0) 2023.03.16
HTML와 CSS  (0) 2023.02.27

겹치는 선분의 길이

def solution(lines):
    dp_list = []  # 겹치는 부분을 저장할 리스트
    for i in range(len(lines)):  # lines의 인덱스
        for j in range(i+1, len(lines)):  # j가 i의 다음값
            # lines[0][1]   lines[1][0]
            # 첫 선분의 end >= 두번째 선분의 start
            # 첫 선분의 시작이 두 번째 선분의 끝보다는 클 때
            # 두 선분이 겹치는 경우
            if lines[i][1] >= lines[j][0] and lines[i][0] <= lines[j][1]:
                dp_list_start = max(lines[i][0], lines[j][0])
                dp_list_end = min(lines[i][1], lines[j][1])

                # 중복 계산 방지 및 중첩되는 부분 제거

                # 빈 값 = dp_list
                for start, end in dp_list:
                    # 앞의 선분을 완전히 덮을 때
                    if dp_list_start <= end and dp_list_end >= start:

                        dp_list_start = min(dp_list_start, start)
                        dp_list_end = max(dp_list_end, end)
                        dp_list.remove((start, end))

                dp_list.append((dp_list_start, dp_list_end))

    # 겹치는 부분들의 길이 합산
    total_length = sum([end - start for start, end in dp_list])

    return total_length

 

 

 

 

시도해 본 것 1

  • 2번 리스트 시작점이 1번 리스트 안에 들어갔냐를 확인(=)
  • 2번 리스트 시작점을 기준으로 1번 끝나는 점까지가 겹치는 선분의 길이
  • 3번 리스트 시작점이 2번 리스트 안에 있나 확인
  • 3번 리스트 시작점을 기준으로 2번 끝나는 점까지가 겹치는 선분의 길이
ef solution(lines):
    dp_list = []
    count = 0

    for idx, line in enumerate(lines):
        if idx+1 < len(lines):
            for i in range(line[0], line[1]+1):
                if lines[idx+1][0] <= i:
                    dp_list.append(i)

    # 1번째 마지막 겹치는 값이 있을 때
    if lines[2][0] in range(lines[0][0], lines[0][1]+1):
        # 있다면 3 start ~ 1 end 까지가 길인데
        for l in range(lines[0][0], lines[0][1]+1):
            if lines[2][0] <= l:
                dp_list.append(l)

        # 연속된 수라서 중복제거함
        dp_list = list(set(dp_list))

    # 선분의 길이를 count로 구함
    for i, dp in enumerate(dp_list):
        if i+1 < len(dp_list):
            if dp_list[i+1] - dp == 1:
                count += 1

    return count

문제점 : 3번째 선분이 가장 길거라는 보장이 없음. 순서가 섞이면 예외처리 못 함.

 

 

 

시도해 본 것 2

  • 중복 리스트를 만들어 다음 인덱스 값이랑 차이가 1 나면 count 함
def solution(lines):
    # range로 lines 안의 요소를 모두 돌림
    # 중복되는 숫자를 가져오기
    num_list = []
    num_list2 = []
    num_list3 = []
    count = 0
    for a, b in lines:
        for x in range(a, b+1):
            num_list.append(x)

    for i in num_list:
        if i not in num_list2:
            num_list2.append(i)
        else:
            if i not in num_list3:
                num_list3.append(i)

    # 다음 수가 전 수 보다 1 차이나면 count
    for i, a in enumerate(num_list3):
        if i+1 < len(num_list3):
            if num_list3[i+1] - a == 1:
                count += 1

    return num_list

 

1주차

 

 

MVT : urls 파일 -> views.py의 함수 호출 -> 함수 실행 (모델) -> 템플릿

    단점 : 새로고침 됨

DRF : 앞으로 템플릿X. javascript만 사용 장고 rest framework

 

 

1. postman 사용

 

2. cURL 복사 -> (터미널) 붙여넣기 : 웹브라우저 html

 

 

클라이언트        -요청 (request) ->         서버

                         <-응답 (response) -

 

 

프로토콜 : 통신 규약(약속)

ex) HTTP : 하이퍼텍스트 전송 프로토콜(html 전송용으로 탄생)

 

웹 브라우저 흐름

1. 도메인(DNS) 조회

    nslookup 도메인 주소 : ip주소 조회

2.  HTTP 요청 메시지 작성

    postman의 console에 찍힌 것들

3. Socket 라이브러리를 통해 전달

4. TCP/IP 작성되고 이 안에 HTTP 메시지가 포함

 

프로토콜 계층

어플리케이션 => Socket Library => TCP => IP => LAN => 인터넷 

+) 추가: TCP/ IP 란?

 

TCP

IP를 TCP로 보안

    출발지 port 목적지 port 정보

    전송 제어와 순서

    검증 정보 등이 실린다.

 

특징

    연결지향 TCP 3 way handshake를 통해 연결이 되었는지 먼저 확인

    데이터 전달을 보증

    순서를 보장

    신뢰 할 수 있어서 대부분 현재 TCP를 사용

 

 

 

TCP 3 way handshake

1. 클라 -> 서버 : SYN

2. 서버 -> 클라 : SYN + ACK

3. 클라 -> 서버 : ACK

SYN을 통해 연결, ACK를 통해 승인

최적화를 통해 요즘은 3단계에서 데이터를 송신

 

 

 

인터넷 프로토콜 

 

 

    지정한 IP 주소로 전송

    출발지 IP와 목적지 IP를 작성

    송신하면 노드들을 거쳐서 송신됨

 

한계

    받을 대상이 없을 수 있다

    중간에 패킷이 손실되거나 순서대로 오지 않을 수 있다.

    같은 IP를 사용하는 어플리케이션이 여러개라면 문제가 생긴다.

 

 

UDP

    기능이 거의 없다

    TCP 기능들이 없다

    IP와 유사한데 포트와 체크섬만 추가

    어플리케이션에서 추가 작업이 필요

    원하는 기능들을 추가해서 만들 수 있는 프로토콜

 

 

Port

    한 컴퓨터에서 게임 화상통화 웹브라우저를 다 킬 수 있다.

    포트는 같은 IP내에서 프로세스 구분을 해 줄 수 있다.

    0~65535 : 사용할 수 있는 포트

    0~1023 은 사용하지 않는 것이 좋다.

 

URI vs URL vs URN

    URI 는 locator, name 또는 둘 다 추가로 분류 될 수 있다.

    URI 라는 개념 아래에 URL과 URN이 존재

    URN은 거의 쓰지 않는다.

 

 

URI

    Uniform : 리소스 식별을 위한 통일 방식

    Resource : 리소스

    Identifier : 식별자

    포트 생략시 http 80, https 443

    리소스 경로는 계층적 구조로 이루어져있다.

    fragment : 페이지 내에서 위치

 

 

 

HTTP 

    HyperText Transfer Protocol

  • 팀 버너스리가 개발(+ WWW)
  • 원래는 HTML 전송용으로 나왔으나 현재는 모든 형태를 전송

           ex) 이미지, 음성, 영상, 파일, JSON, XML 등

  • 클라이언트 서버 구조
  • stateless

 

역사

 

1. 1991 GET 메소드만 지원, 헤더가 없음

2. 1996  메소드와 헤더 추가

3. 1997 HTTP 1.1

4. 2015 HTTP2 성능 개선

5. 2020 HTTP3

 

 

클라이언트 서버 구조

클라이언트는 Request를 보내고 서버는 Response를 보냄

왜 분리가 중요할까?

    태초에 클라이언트와 서버의 개념이 분리되어 있지 않았다.

    데이터와 비즈니스 로직을 전부 서버(백)에 넣고

    클라이언트(프론트)에는 ui를 다 넣는다

    클라이언트가 모바일, 티비, 웹 모든 것이 될 수 있다.

    서버 또는 트래픽 폭주시 클라이언트는 그대로 두고 서버만 독립적으로 진화시킴

 

 

무상태 프로토콜(stateless)

    서버가 클라이언트 상태를 보존하지 않는다.

    중간에 다른 점원으로 바뀐다고 생각해야 한다.

    무상태는 응답서버를 쉽게 바꿀 수 있다.

    세션 로그인은 상태가 있다. 세션은 최소한으로만 사용

 

 

비연결성 

    요청시마다 연결을 유지하면 클라이언트가 많아지면 서버가 터짐

    연결 유지를 하지 않으면서 최소한의 자원 사용

    HTTP는 기본적으로 연결을 유지하지 않는다

    일반적으로 초단위 이하의 빠른 응답

    1시간 동안 수천명이 써도 실제 동시처리하는 요청은 몇십개도 안된다.

    서버 자원을 효율적으로 쓸 수 있다.

 

 

 

 

HTTP 안좋은 설계 

    각각 url을 만들어서 처리

        ex) 회원 등록, 수정, 삭제등을 각각의 url로 만듬

    리소스  식별

 

 

리소스란?

    회원이라는 개념이 리소스.

    이것이 URI에 매핑됨

    거기에 하는 행위는 메소드로 하는 것

        ex) /user/{id} 회원의 등록, 수정, 삭제를 처리

    

리소스와 행위를 분리하는 것이 Restful API

    리소스 : 회원

    행위 : 조회, 등록, 삭제, 변경

 

 

메소드

    Get : 조회

  • 데이터는 쿼리 스트링으로 전달

      주소창에 =, ? 등으로 전달되는 정보

 

    Post : 등록(DB)

  • 메시지 바디를 통해 서버로 요청 데이터 전달
  • 데이터를 처리
  • 혹은 프로세스를 처리. (배달 시작 버튼처럼 데이터가 없어도 프로세스 상태가 변경되는 경우) POST  /order/{orderId}/start-delivery
  • 새로운 리소스가 생성되지 않을 수도 있음
  • JSON으로 조회 데이터를 넘기고 싶은데 GET 메서드 쓰기 힘든 경우에도 씀
  • GET은 캐싱 할 수 있어서 가능한 경우 GET을 쓴다.

    Put : 대체, 혹은 생성

  • 파일 붙여넣기와 동일, 없으면 만들고 있으면 덮어씀
  • 포스트와 차이점은 put은 클라이언트가 URI를 지정해서 보냄
  • 내용을 전체 다 가지고 옴

 

    Patch : 내용의 일부분 변경

    Head : Get과 동일하지만 상태줄과 헤더만 반환

 

메소드의 속성

    안전: 리소스가 변경이 되냐 안되냐

    멱등 : 몇번 하든 결과가 같다. GET/PUT/DELETE는 결과가 같다. POST는 중복돼서 발생할 수 없어짐. 멱등 여부에 따라 timeout시에 재요청 해도 되냐가 결정

    캐시기능 : GET, HEAD 정도만 캐시

 

데이터 전송

    쿼리 파라미터

        GET, 주로 검색, 정렬 필터

    메시지 바디

        POST, PUT, PATCH, 회원가입, 상품주문, 리소스 등록 변경

 

HTML Form을 통한 데이터 전송

    회원가입, 주문, 데이터 변경

    HTML Form 은 Get, Post만 지원

    Content-Type : application/ x- www-form-urlencoded

        username-kwon&age=20 식으로 바디 데이터 쿼리 파라미터처럼 실림

        전송 데이터는 url encoding 처리 된다.

    Content-Type : multipart/form-data

         파일을 같이 보낼 때 써야 함. 바이너리 데이터 보낼 때 사용

         다른 종류의 여러 파일과 폼의 내용을 함께 전송 가능

 

HTTP API를 통한 데이터 전송

    회원가입, 주문, 데이터 변경

    서버 to 서버, 앱 클라이언트, 웹 클라이언트(ajax)

    Content-Type: application/json

    Form 대신 JS를 이용한 통신

    Post, Put, Patch도 메시지 바디로 데이터 전송 가능

 

 

API 설계 예시

    GET/ user : 회원 목록

    POST/user : 회원 등록

    GET/ user/{id} : 회원 조회

    PATCH, PUT, POST/user/{id} : 회원 수정

    DELETE/ user/ {id} : 회원 삭제

 

클라이언트는 동록될 리소스의 URI를 모른다.

서버가 리소스의 URI를 생성한다

/user 가 컬렉션 된다.

 

 

 

HTTP 상태 코드

1xx : 요청이 수신되어 처리중. 거의 사용x

2xx : 

    200 OK

    201 Created

        : Header에 Location을 추가해서 새로운 리소스의 URI를 알려줄 수 있다.

    202 Accepted

        : 요청은 접수했다

    204 No Content

        : save 버튼을 눌러 저장만 하고 화면 변화가 필요 없을 때

3xx: 추가 행동 필요

    웹브라우저는 3xx의 헤더에 Location이 있으면 자동으로 리다이렉트 한다.

    영구 리다이렉트 : 영구 이동, 메소드와 바디가 바뀌는 301 안바뀌는 308이 있다.

    일시 리다이렉트 : 일시적 변경. 주문완료 후 주문 내역으로 이동

        302 : 리다이렉트시 메소드틑 GET. 본문은 제거

        307 : 리다이렉트시 메소드와 본문 유지

        PRG(Post/Redirect/Get)

            Post 주문 후 새로고침시 중복주문이 가능하다.

            주문 완료시 302를 줘서 리다이렉트 시키면 새로고침해도 결과 화면만 다시 요청한다.

4xx : 클라이언트 에러

    잘못된 문법. 오류의 원인이 클라이언트

        400 : 요청 내용을 다시 검토. API 스펙이 맞는지를 확실히 해야 한다. (프론트)

        401 : 인증이 안됨

        인증 vs 권한 : 인증은 로그인이 안됐다. 권한은 내가 운영자가 아니다. Authentication vs Authorization

        오류는 Unauthorized로 그냥 쓰고 있다.

        403 : 권한이 없다. 로그인된 회원이 운영진이 아니다.

        404 : 리소스가 없다. 숨기고 있다. (개발시 주로 url 틀렸을 때)

5xx : 서버 에러

    복구 후 재시도시 성공 가능하다.

        500 : 서버 내부 문제

        503 : 서버 일시 과부하

 

 

 

HTTP Header

    field-name(key)는 대소문자 구분이 없다.

        content-type(필드값) = Content-Type

    HTTP 전송에 필요한 모든 부가정보

        메시지 바디의 내용

        메시지 바디의 크기

        압축

        인증

        요청 클라이언트

        캐시 관리

    표준 헤더가 너무 많고 필요시 임의의 헤더도 추가 가능

        HTTP headers - HTTP | MDN(mozila.org)

    헤더에는 바디의 데이터를 해석할 수 있는 정보를 제공

 

 

표현에 관한 헤더

    리소스가 html vs xml vs json ? 중에 뭘로 표현했는가

        Content-Type: 형식

            text/html;charset=utf-8

            aplication/json

            image/png

        Content-Encoding : 압축방식, 압축해서 보내준 경우

            gzip

            deflate

            identity : 압축 안 함

        Content-Language

            ko

            en

            en-US

        Content-Length : 길이

            바이트 단위

            Transfer-Encoding 사용시 Content Length는 사용하면 안 됨

 

 

컨텐트 협상(Content Negotiation)

    협상 헤더는 요청시에만 사용

        Accept : 클라이언트가 선호하는 미디어 타입 전달

            구체적인것이 우선된다.

            text/plain;format=flowed

            text/plain

            text/*

        Accept-Charset : 클라이언트가 선호하는 문자 인코딩

        Accept-Encoding : 클라이언트가 선호하는 압축 인코딩

        Accept-Language : 클라이언트가 선호하는 자연 언어

            서버에서 다중 언어를 지원

            한국어 브라우저를 쓰면 한국어를 선호한다는 것을 알려준다

            서버에서 한국어로 보내준다.

            여러가지 언어에 대한 우선순위가 필요한 경우 quality values(q)를 사용한다.

            1이 가장 높고 0이 가장 낮다. 생략시 1

            accept-language: en;q=0.9 ko;q=0.8

 

 

 

전송 방식 헤더

    단순 전송

        Content-Length

    압축 전송

        gzip같은 걸로 서버에서 압축시 절반 정도로 줄어든다.

        Content-Encoding : gzip으로 알려줘야 클라이언트에서 알고 푼다.

    분할 전송

        Transfer-Encoding : chunked

            content length를 보내면 안된다.

        용량이 클 걸 분할해서 전송한다.

    범위 전송

        Range 명시로 어디서 어디까지 왔는지

 

 

일반 정보

    referer : 어디에서 왔냐. 유입 경로 분석용

    user-agent ; 어느 브라우저냐? 특정 브라우저에서만 오류가 생기는 것을 파악하기 좋다. 사용자들이 어느 브라우저를 사용하는지 알 수 있다.

    server : 요청을 처리하는 서버의 소프트웨어 정보

 

특별 정보

    Host : 요청한 호스트 정보(도메인) 필수값

        하나의 서버에 여러 IP가 있을 수 있기 때문에 필요하다. 초창기에 많은 문제가 있었다.

        그래서 Host는 필수로 들어가게 됐다.

    Allow : 허용 가능한 메서드. 405 리스폰스를 줄 때 응답에 포함한다.

    Retry-After : 날짜 혹은 초단위 표기로 다시 요청을 하라고 하나 사용하기는 쉽지 않다.

 

 

인증

    Authorization : 클라이언트의 인증정보를 서버에 전달.

        인증 방식에 따라 들어가는 값이 상이하다.

    WWW-Authenticate : 리소스 접근시 필요한 인증 방법 정의

        리스폰스 시 401 Unauthorized와 함께 사용. 어떻게 인증정보를 만들지에 대한 정보

 

 

쿠키

HTTP는 무상태 연결이기에 상태를 매번 보내줘야 한다.

모든 요청과 링크에 사용자 정보를 포함해야 한다는 단점이 있다.

이를 해결하기 위해 쿠키가 도입됐다.

 

    Set-Cookie : 리스폰스시 서버에서 클라이언트로 쿠키 전달

        만료기간/경로/도메인을 설정

        사용처 : 로그인 세션 관리(쿠키-세션 방식), 광고 정보 트래킹

        쿠키는 항상 서버에 전송되다 보니 트래픽이 추가 유발된다. 최소한의 정보만 쓰자.

        서버에 전송이 필요 없고, 웹 브라우저에 저장하고 싶으면  localStorage를 쓰면 된다.

        보안에 민감한 주민번호, 신용카드 번호 등은 저장하지 않는다.

        만료일자를 생략하면 브라우저 종료시 삭제

        만료일(expires)나 시간(max age)를 지정할 수 있다.

        경로 지정으로 원하는 도메인만 쿠키를 보낸다.

    Cookie : 클라이언트가 서버에서 받은 쿠키 저장. 요청시 서버로 전달.

 

 

HTTP Header(2) - Cache

    캐시가 없다면 매번 같은 요청이 와도 헤더와 바디를 새로 보내준다.

    네트워크는 느리고 비싸므로 아껴 써야 한다.

    브라우저 캐시가 있다면

    cache-control 을 통해서 리스폰스가 캐시의 유효 기간을 설정해 준다.

    응답 결과를 브라우저에 저장해두면 두번째 요청을 캐시에서 받아온다.

    캐시 유효 기간이 지났다면 다시 서버를 통해 데이터를 조회하고 다운로드한다.

 

검증 헤더와 조건부 요청

    캐시 유효기간 초과한 경우 둘 중 하나의 상황

        1.서버에서 기존 데이터가 변경됨

        2. 기존 데이터가 동일함

    검증 헤더 Last-modified를 추가해서 데이터에 변경이 있었는지 없었는지 정보를 추가한다.

    검증 헤더를 보고 캐시의 유효기간만 늘려줄 수 있다.

    if - modified-since를 이용해서 다시 보내줘야하는지 판단 할 수 있다. 304를 이용해서 캐시 데이터를 쓴다.

 

캐시와 조건부 요청 헤더

    Cache-control : max-age

        캐시 유효기간

    Cache-control : no-cache

        서버에 검증하고 사용

    Cache-control : no-store

        민감한 정보로 최대한 빨리 삭제

 

'Python > Django' 카테고리의 다른 글

11. Django gitignore, 시크릿 키  (0) 2023.04.24
10. Django 폼  (0) 2023.04.24
09. Django 템플릿 상속  (0) 2023.04.17
08. Django css  (0) 2023.04.17
07. Django from 태그  (0) 2023.04.16

+ Recent posts