<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>lution88</title>
    <link>https://dbswjdrl88.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 9 Apr 2026 12:51:07 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>lution88</managingEditor>
    <item>
      <title>[220831] JWT 토큰 사용하기[1]</title>
      <link>https://dbswjdrl88.tistory.com/101</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;# JWT 토큰 사용 및 인증과 인가&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 인증과 인가&lt;br /&gt;2. JWT인증 관련&lt;br /&gt;3. bcrypt&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Django에서 로그인과 회원가입 회원탈퇴에 사용할 JWT토큰 사용법 및 인증과 인가에 대해서 알아보자.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;먼저 인증 Authentication 과 인가 Authorization 란 무엇일까?&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;인증과 인가는 API에서 자주 구현되는 기능들 중 하나이다.&lt;/span&gt;&lt;br /&gt;&lt;b&gt;- 인증 :&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;사용자의 신원을 확인하는 절차이다. 사용자의 id와 password를 받아서 등록된 사용자가 맞는지 검증하는 것이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;인가 :&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;인증이 로그인 과정이라면 인가는 인증이 완료된 사용자에게 권한을 주는 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;인증 Authentication 이란?&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;인증이란 유저 아이디와 비밀번호를 확인하는 절차를 가리키며, 쉽게 로그인하는 과정을 생각하면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;인증을 위해서는 아이디/비번을 생성할 수 있는 회원가입 기능 또한 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;인증절차는 어떻게 될까?&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1661943993821&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# 로그인의 과정

1. 회원가입을 통한 ID 아이디/PW 비밀번호 생성
2. 비밀번호 암호화 &amp;gt; Database 저장
3. 유저 로그인 : ID 와 PW 입력
4. 비밀번호 확인 : 비밀번호를 암호화 한 뒤 DB의 암호와 같은지 확인한다. 일치하면 로그인 성공!
5. 로그인 성공 &amp;gt; access token을 클라이언트에게 전달
6. 발급받은 access token을 통해 로그인 유지 및 서비스 사용&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;로그인을 하기 위해서 우리는 먼저 ID와 Password를 DB에 저장해야 한다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;즉, 회원가입을 통해 아이디와 비밀번호를 DB에 저장하게 되며, DB에 저장된 정보와 로그인 시 입력하는 값이 같을 경우&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;인증 절차가 정상적으로 끝나게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 과정에서 우리가 꼭 알아야 하는 것은&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;DB에 저장되는 비밀번호는 암호화를 거친 상태라는 것과&lt;/li&gt;
&lt;li&gt;로그인 인증을 받으면 access token을 통해 서비스를 이용하게 된다는 것이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;그렇다면 암호화 된 비밀번호의 비밀번호는 어떻게 암호화 되는 것일까?&lt;/span&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;먼저 &lt;b&gt;단방향 해쉬함수&lt;/b&gt;를 사용한 암호화가 있다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;단방향 해쉬 함수를 사용한 암호화는 한번 암호화 된 정보는 되돌릴 수 없다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;그렇기 때문에 DB에 저장된 암호화 된 비밀번호와 로그인 시 입력받은 비밀번호를 암호화 하여 동일한지 확인하고,&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;동일하다면 로그인이 진행된다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;하지만 단 방향 해쉬 함수는 입력값에 대한 결과값이 정해져 있어 역추적이 가능하다는 취약점이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;두 번째로는 Bcrypt를 사용하는 것이다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #666666;&quot;&gt;bcrypt는 비밀번호를 위해 만들어진, 단방향 해쉬함수의 취약점을 보완한 암호화 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Salting은 실제 비밀번호 이외에 랜덤데이터를 추가하여 해시값을 늘린다.&lt;br /&gt;그래서 암호의 길이를 늘린 후 역추적의 경우의 수를 늘려 해쉬테이블을 만들지 못하도록 한다.&lt;/li&gt;
&lt;li&gt;Key Stretching을 사용하는데 단방향 해쉬함수를 여러 번 반복해서 해시값을 계산하는 방법이다.&lt;br /&gt;key stretching은 암호화 하는 속도를 늦춰 로그인 시 지연이 살짝 발생할 수 있다.&lt;br /&gt;하지만 컴퓨터의 성능이 향상되는 만큼 암호화 반복횟수를 늘려 암호화 보완이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;JWT란?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT 는 (JSON Web Token)으로 JSON 구문으로 작성된 웹 토큰, 로그인에 성공하게 되면 access token을 발급받는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;access token에는 몇 가지 종류가 있지만 가장 많이 사용하는 기술중 하나가 JWT이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT는 유저정보를 담은 JSON데이터를 암호화하여 클라이언트와 서버간에 주고 받게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT발급과 사용&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 사용자 회원가입&lt;br /&gt;2. 인증서버에서 JWT생성&lt;br /&gt;3. 사용자에게 JWT 전달&lt;br /&gt;4. 사용자는 JWT를 통해 서비스 이용&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;인가 Authorization 란 무엇인가?&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자가 요청을 실행할 수 있는 권한이 있는지 확인하는 절차이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JWT를 통해 구현하고 access token으로 사용자 정보를 얻을 수 있으므로 권한을 확인 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저는 요청을 보낼 때 encoding 된 access token을 함께 첨부하며, 서버는 access token을 decoding을 통해 데이터를 확인, 유저 정보를 얻는다. 서버에서 해당 유저 정보를 통해 권한(permission)을 확인하며 해당 요청을 처리하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발일지/# TIL</category>
      <category>bcrypt</category>
      <category>JWT</category>
      <category>인가</category>
      <category>인증</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/101</guid>
      <comments>https://dbswjdrl88.tistory.com/101#entry101comment</comments>
      <pubDate>Wed, 31 Aug 2022 23:01:58 +0900</pubDate>
    </item>
    <item>
      <title>[allauth] allauth란?</title>
      <link>https://dbswjdrl88.tistory.com/100</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Django에서 유저기능을 구현할때 기본적으로 사용하는 것은 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;django.contrib.auth&lt;/b&gt;&lt;/span&gt; 패키지 입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;contrib&lt;/span&gt;에는 장고가 빠르고 간편하게 웹개발을 할 수 있도록 이미 완성된 앱 여러개가 포함되어 있다.&amp;nbsp;&lt;br /&gt;auth, admin, staticfiles 등 다양한 contrib 앱들이 있다.&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;auth&lt;/span&gt;는 authentication으로 유저 인증(유저의 아이디와 비밀번호를 확인하는 절차)을 뜻한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;django.contrib.auth 안에는 유저기능을 구현하기 위한 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;유저모델 User model&lt;/span&gt;과 /login, /logout 과 같은 url패턴을 정리하는 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;urls 파일&lt;/span&gt;,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;login 로직을 처리하기 위한 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;views&lt;/span&gt; 와 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;form&lt;/span&gt; 들이 다 포함되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 우리는 이 코드들을 프로젝트에 가져와서 사용하기만 하면 비교적 쉽게 원하는 유저 시스템을 만들 수 있죠.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Django-allauth&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&quot;django-allauth&quot;&lt;/span&gt; 또한 django.contrib.auth 처럼 유저기능을 위한 패키지 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;allauth는 django에 기본적으로 포함되어 있지 않기 때문에 따로 설치를 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;allauth 안에도 유저기능을 위한 urls, views 그리고 forms 같은 앱들이 있는데 django.contrib.auth와 달리 유저모델User model은 포함되어 있지 않습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 보통 django-allauth를 사용할 때 유저모델은 django.contrib.auth의 유저모델을 사용하고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;나머지 유저 기능들은 allauth를 사용하는 경우가 일반적 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;django-allauth는 실제 존재하는 이메일인지 확인하는 '이메일인증', 소셜 서비스를 이용해서 로그인 하는 '소셜 로그인' 등을 제공합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소셜로그인은 이미 존재하는 계정(구글, 페이스북, 카카오톡 등)들로 로그인 하는 것을 뜻합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;django-allauth를 이용해서 일반 로그인 시스템을 구현해놓는다면 나중에 소셜로그인도 쉽게 추가할 수 있는 확장성면의 장점이 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;allauth 셋업&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 순서는 allauth 공식페이지 installation을 보면 수월합니다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. allauth 설치&lt;/p&gt;
&lt;pre id=&quot;code_1661265878161&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;pip install django-allauth&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. settings.py에서 allauth 설정하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- AUTHENTICATION_BACKENDS 추가('''주석은 해제''')&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;172&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GmOQE/btrKq4pSkfL/1P62bhnFE5aKdhOiHX5YN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GmOQE/btrKq4pSkfL/1P62bhnFE5aKdhOiHX5YN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GmOQE/btrKq4pSkfL/1P62bhnFE5aKdhOiHX5YN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGmOQE%2FbtrKq4pSkfL%2F1P62bhnFE5aKdhOiHX5YN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;689&quot; height=&quot;172&quot; data-origin-width=&quot;689&quot; data-origin-height=&quot;172&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- INSTALLED_APPS 에 필요한 앱들을 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;258&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LNUaC/btrKoS5h1fs/VYLbPyZY98nf5UK8Px2zzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LNUaC/btrKoS5h1fs/VYLbPyZY98nf5UK8Px2zzk/img.png&quot; data-alt=&quot;공식문서를 보면 INSTALLED_APPS 에 추가할 항목들이 나와있다. 픽해서 세팅스에 넣는다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LNUaC/btrKoS5h1fs/VYLbPyZY98nf5UK8Px2zzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLNUaC%2FbtrKoS5h1fs%2FVYLbPyZY98nf5UK8Px2zzk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;258&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;258&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공식문서를 보면 INSTALLED_APPS 에 추가할 항목들이 나와있다. 픽해서 세팅스에 넣는다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필요에 따라 &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;b&gt;SITE_ID = n&lt;/b&gt;&lt;/span&gt; 이라는 설정을 settings에 추가해준다.&lt;br /&gt;django.contrib.sites는 어떤 기능을 여러 웹 사이트에서 사용할 수 있도록 해주는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비슷한 컨텐츠나 기능을 갖고있는 웹 사이트가 여러 개 필요할 때는 django.contrib.sites를 사용해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;django프로젝트 하나로 여러 웹 사이트를 운영할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SITE_ID 는 위와 같은 상황에서 각각의 사이트의 아이디라고 볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 사이트를 하나만 만들거면 SITE_ID = 1 으로 settings.py에 설정해주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. urls.py 에 path 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- allauth에서 제공하는 URL 들을 사용하기 위해서 프로젝트의 urls.py에 path를 추가한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d3QGS2/btrKq5PQifG/Vyrd8uYn1ser8doPPZPPQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d3QGS2/btrKq5PQifG/Vyrd8uYn1ser8doPPZPPQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d3QGS2/btrKq5PQifG/Vyrd8uYn1ser8doPPZPPQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd3QGS2%2FbtrKq5PQifG%2FVyrd8uYn1ser8doPPZPPQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;697&quot; height=&quot;110&quot; data-origin-width=&quot;697&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. migrate 진행.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;32&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/C9NDQ/btrKrqMYEmV/GNPbP6X3kPklKKQ1c6KQrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/C9NDQ/btrKrqMYEmV/GNPbP6X3kPklKKQ1c6KQrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/C9NDQ/btrKrqMYEmV/GNPbP6X3kPklKKQ1c6KQrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FC9NDQ%2FbtrKrqMYEmV%2FGNPbP6X3kPklKKQ1c6KQrK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;696&quot; height=&quot;32&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;32&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기까지 진행했으면 allauth 기본 셋업은 모두 완료되었다!&lt;/p&gt;</description>
      <category>개발일지/# Django</category>
      <category>allauth</category>
      <category>Django</category>
      <category>django-allauth</category>
      <category>유저기능</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/100</guid>
      <comments>https://dbswjdrl88.tistory.com/100#entry100comment</comments>
      <pubDate>Tue, 23 Aug 2022 23:40:57 +0900</pubDate>
    </item>
    <item>
      <title>OSI 7 계층이란?</title>
      <link>https://dbswjdrl88.tistory.com/99</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;OSI 7계층이란 통신이 일어나는 일련의 과정을 7단계로 정의한 국제 통신 표준 규약입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;계급과 상하구조가 존재하며 각 계층은 독립되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정한 곳에 이상이 생기면 그 단계만 수정할 수 있습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;832&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bnYYI6/btrJFOOrTUe/MymzLE9Sqh1nW5P25KkqR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bnYYI6/btrJFOOrTUe/MymzLE9Sqh1nW5P25KkqR0/img.png&quot; data-alt=&quot;OSI 7 계층&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bnYYI6/btrJFOOrTUe/MymzLE9Sqh1nW5P25KkqR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbnYYI6%2FbtrJFOOrTUe%2FMymzLE9Sqh1nW5P25KkqR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;447&quot; height=&quot;517&quot; data-origin-width=&quot;720&quot; data-origin-height=&quot;832&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OSI 7 계층&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 물리 계층 (Physical Layer)&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물리계층은 비트단위의 데이터를 전기신호로 변환하여 전송하는 역할을 한다.&lt;/li&gt;
&lt;li&gt;단지 데이터를 전송할 뿐 데이터가 무엇인지 어떤 오류가 있는지 등은 신경쓰지 않는다.&lt;/li&gt;
&lt;li&gt;단위는 bit 이고 관련장비는 케이블, 리피터, 허브가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 데이터 링크 계층 (Data Link&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Layer&lt;/span&gt;)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 링크 계층은 물리계층에서 송수신되는 정보의 오류와 흐름을 관리하여 안전한 정보의 전달을 수행할 수 있도록 도와준다.&lt;/li&gt;
&lt;li&gt;MAC 주소를 통해 통신한다.&lt;/li&gt;
&lt;li&gt;frame에 MAC 주소를 부여하고 에러검출, 재전송, 흐름 제어를 진행한다.&lt;/li&gt;
&lt;li&gt;단위는 frame 이고 관련 장비는 브릿지, 스위치 등이 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 네트워크 계층 (Network&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Layer&lt;/span&gt;)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;네트워크 계층은 데이터(패킷)을 목적지까지 안전하고 빠르게 전달하는 기능을 담당한다.&lt;/li&gt;
&lt;li&gt;라우터를 통해 이동할 경로를 선택하고, IP주소를 지정하여 해당 경로에 따라 패킷을 전달한다.&lt;/li&gt;
&lt;li&gt;단위는 packet 이고 관련 장비로는 라우터가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 전송 계층 (Transport&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Layer&lt;/span&gt;)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최종 수신 프로세스로 실제 데이터의 전송을 담당한다.&lt;/li&gt;
&lt;li&gt;TCP, UDP 프로토콜을 통해 통신을 활성화한다.&lt;/li&gt;
&lt;li&gt;Port를 열어두고 프로그램들이 전송할 수 있도록 제공한다.&lt;/li&gt;
&lt;li&gt;단위는 Segment 이고 관련 장비는 TCP, UDP 가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 세션 계층 (Session&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Layer&lt;/span&gt;)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션계층은 데이터가 통신하기 위한 논리적 연결을 담당한다.&lt;/li&gt;
&lt;li&gt;TCP/IP 세션을 만들고 없애는 책임을 지니고 있다.&lt;/li&gt;
&lt;li&gt;송수신간의 관련성 유지, 대화 제어를 담당한다.&lt;/li&gt;
&lt;li&gt;동기 제어, 데이터 교환 관리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;☞ 표현 계층 (Presentation&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Layer&lt;/span&gt;)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터 표현에 대한 독립성을 제공하고 암호화하는 역할을 담당한다.&lt;/li&gt;
&lt;li&gt;파일 인코딩, 명령어 포장, 압축, 암호화를 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;☞&lt;span&gt; 응용 계층 (Application Layer)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응용 프로세스를 직접 사용하여 직접적인 응용 서비스를 수행하는 계층이다.&lt;/li&gt;
&lt;li&gt;FTP, HTTP, SMTP 등과 같은 프로토콜들이 속해있다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>Computer Science/Network</category>
      <category>cs</category>
      <category>network</category>
      <category>osi7layer</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/99</guid>
      <comments>https://dbswjdrl88.tistory.com/99#entry99comment</comments>
      <pubDate>Sun, 14 Aug 2022 17:50:48 +0900</pubDate>
    </item>
    <item>
      <title>HTTP 메소드</title>
      <link>https://dbswjdrl88.tistory.com/98</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 메소드는 클라이언트가 서버에게 사용자 요청을 알리는 수단입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메소드의 종류로는 GET, POST, PUT, PATCH, DELETE 가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- GET : 데이터 조회&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- POST : 요청 데이터 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PUT : 데이터 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PATCH : 일부 데이터 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- DELETE : 데이터 삭제&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Q. GET 과 POST의 차이는?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET은 클라이언트에서 서버로 어떠한 정보를 요청 위해 사용되는 메소드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버에서 어떤 데이터를 가져와서 보여줄 때 값이나 내용, 상태 등을 바꾸지 않는 경우 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET은 리소스를 쿼리스트링으로 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST는 리소스를 생산/업데이트 하기 위해 서버에 데이터를 보내는 데 사용되는 메소드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;서버상의 데이터 값이나 상태를 바꾸기 위해서 사용합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;POST는 리소스를 HTTP Body로 전달합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET과 POST의 주요 차이점은 GET 요청은 캐시가 되고, POST는 캐시가 되지 않는다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GET은 브라우저에 기록이 되지만, POST는 기록이 되지 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 캐시란 한번 접근 후, 다시 요청할 시 빠르게 접근하기 위해서 레지스터에 데이터를 저장시켜 놓는 것을 말합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/B0wZS/btrJE3LEJda/3daH5nGP5YNqzqYUk696j0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/B0wZS/btrJE3LEJda/3daH5nGP5YNqzqYUk696j0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/B0wZS/btrJE3LEJda/3daH5nGP5YNqzqYUk696j0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FB0wZS%2FbtrJE3LEJda%2F3daH5nGP5YNqzqYUk696j0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;736&quot; height=&quot;364&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;table data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align=&quot;left&quot;&gt;&amp;nbsp;&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;GET&lt;/th&gt;
&lt;th align=&quot;center&quot;&gt;POST&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;캐시&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;O&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;브라우저 기록&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;O&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;북마크 추가&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;O&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;데이터 길이 제한&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;O&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;HTTP 응답 코드&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;200(OK)&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;201(Created)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;언제 주로 사용되는가?&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;리소스 요청&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;리소스 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;리소스 전달 빵식&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;쿼리스트링&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;HTTP Body&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align=&quot;left&quot;&gt;idempotent&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;O&lt;/td&gt;
&lt;td align=&quot;center&quot;&gt;X&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- idempotent 멱등성 : 연산의 한 성질로, 연산을 여러 번 적용 하더라도 결과가 달라지지 않는 성질을 의미한다.&lt;/p&gt;</description>
      <category>Computer Science/Network</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/98</guid>
      <comments>https://dbswjdrl88.tistory.com/98#entry98comment</comments>
      <pubDate>Sat, 13 Aug 2022 18:23:42 +0900</pubDate>
    </item>
    <item>
      <title>HTTP의 상태코드</title>
      <link>https://dbswjdrl88.tistory.com/97</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP의 상태코드는 1xx번대부터 5xx번대까지 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1xx 번대는 정보확인에 대한 상태코드이고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2xx 번대는 통신 성공, 3xx 번대는 리다이렉트, 4xx 번대는 클라이언트 에러, 5xx 번대는 서버 에러를 나타냅니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;1xx 번대 : 정보 확인&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;2xx 번대 : 통신 성공&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 200 : OK, 요청 성공(GET)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 201 : Create, 생성 성공(POST)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;3xx 번대 : 리다이렉트&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;4xx 번대 : 클라이언트 에러&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - 400 : Bad Request, API에서 정의되지 않은 요청이 들어온 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - 401 :&lt;span&gt; Unauthorized, 인증 오류&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - 403 :&lt;span&gt; Forbidden, 권한 밖의 접근 시도&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - 404 :&lt;span&gt; Not Found, 요청 URI에 대한 리소스가 존재하지 않는 경우&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;5xx 번대 : 서버 에러&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - 500 :&lt;span&gt; Internal Server Error, 서버 내부 오류&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - 502 :&lt;span&gt; Bad Gateway, 게이트웨이 오류&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - 503 :&lt;span&gt; Service Unavailable, 서비스 이용 불가&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; - 504 :&lt;span&gt; Gateway Timeout, 게이트웨이 시간 초과&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Computer Science/Network</category>
      <category>cs</category>
      <category>HTTP 상태코드</category>
      <category>network</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/97</guid>
      <comments>https://dbswjdrl88.tistory.com/97#entry97comment</comments>
      <pubDate>Sat, 13 Aug 2022 17:53:41 +0900</pubDate>
    </item>
    <item>
      <title>HTTPS 란?</title>
      <link>https://dbswjdrl88.tistory.com/96</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS란 http에 암호화가 추가된 프로토콜입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http는 평문 데이터를 전송하는 프로토콜이기 때문에 http로 비밀번호, 주민번호 등 보안이 필요한 데이터를 주고받는 경우,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;제 3자에 의해서 조회가 될 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 방지하기 위해 http에 암호화가 추가된 프로토콜(SSL)이 https 입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, HTTPS는 SSL 프로토콜을 사용해 클라이언트와 서버가 자원을 주고 받을 때 사용하는 통신규약인 것이죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - SSL : Secure Socket Layer&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;: 보안 소켓 계층으로 웹 사이트와 브라우저 사이에 전송되는 데이터를 암호화하여 인터넷 연결을 보호하기 위한 표준 기술.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; - HTTP : HTTP &amp;lt;-&amp;gt; TCP |&amp;nbsp;HTTPS : HTTP &amp;lt;-&amp;gt; SSL &amp;lt;-&amp;gt; TCP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS에서는 대칭키 암호화와 비대칭키 암호화가 모두 사용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비대칭키 암호화/복호화는 비용이 매우 크므로, 서버와 클라이언트가 주고 받는 모든 메시지를 비대칭키로 암호화하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오버헤드가 발생할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 서버와 클라이언트가 최초 1회 서로 대칭키를 주고받을 때 비대칭키를 사용하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 메세지를 주고받을 때는 주고받은 대칭키로 암호화/복호화를 합니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;암호화 과정&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;클라이언트가 서버로 최초 연결을 시도합니다.&lt;/li&gt;
&lt;li&gt;서버는 공개키(인증서)를 브라우저에게 넘겨줍니다.&lt;/li&gt;
&lt;li&gt;브라우저는 인증서의 유효성을 검사하고 세션키를 발급합니다.&lt;/li&gt;
&lt;li&gt;브라우저는 세션키를 보관하고 추가로 서버의 공개키로 세션키를 암호화하여 서버로 전송합니다.&lt;/li&gt;
&lt;li&gt;서버는 전송받은 세션키를 자신의 공개키를 사용하여 복호화 하여 세션키를 얻습니다.&lt;/li&gt;
&lt;li&gt;클라이언트와 서버는 동일한 세션키를 공유하므로 이 후 데이터를 전달할 때는 세션키로 암호화/복호화를 진행합니다.&lt;/li&gt;
&lt;li&gt;공개키로 암호화된 메세지는 개인키를 가지고 있어야만 복호화가 되기 때문에 서버(기업)을 제외한 누구도 알 수 없습니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Computer Science/Network</category>
      <category>cs</category>
      <category>https</category>
      <category>network</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/96</guid>
      <comments>https://dbswjdrl88.tistory.com/96#entry96comment</comments>
      <pubDate>Sat, 13 Aug 2022 17:42:53 +0900</pubDate>
    </item>
    <item>
      <title>HTTP란?</title>
      <link>https://dbswjdrl88.tistory.com/95</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP란 무엇인가요?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;HTTP&lt;/b&gt;란 Hyper Text Transfer Protocol 로 평문 데이터를 주고 받을 수 있는 프로토콜로,&amp;nbsp;서버/클라이언트&amp;nbsp;모델을&amp;nbsp;따릅니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http는 method, path, version, header, body로 구성되어 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTP는 상태 정보를 저장하지 않는 stateless 특징과 클라이언트 요청에 맞는 응답을 하고 연결을 끊는 connectless 특징이 있습니다.&lt;br /&gt;- Stateless 는 연결을 끊으면 클라이언트와 서버의 접속이 끝나며, 상태정보는 유지하지 않는 것을 말합니다.&lt;br /&gt;- Connectless 는 클라이언트 요청에 맞는 응답을 한 뒤 연결을 끊는 것을 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http의 장점은 통신 간의 연결 상태 처리나 상태 정보를 관리할 필요가 없기 때문에 서버 디자인이 간단합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또 각각의 http 요청에 독립적으로 응답만 보내주면 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;http의 단점은 이전 통신의 정보를 모르기 때문에 매번 인증을 해줘야 한다는 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 쿠키나 세션을 사용해서 데이터를 처리해야 합니다.&lt;/p&gt;</description>
      <category>Computer Science/Network</category>
      <category>cs</category>
      <category>http</category>
      <category>network</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/95</guid>
      <comments>https://dbswjdrl88.tistory.com/95#entry95comment</comments>
      <pubDate>Sat, 13 Aug 2022 17:33:56 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] 파이썬 리스트 join 활용하기</title>
      <link>https://dbswjdrl88.tistory.com/94</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬 기초 300제를 풀다가 몰랐던 기능을 배워서 정리해보려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로&amp;nbsp; &lt;b&gt;&quot;join 함수&quot; .&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬의 join 함수는 다음과 같은 형태를 갖습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &quot;&quot;.join(리스트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &quot;구분자&quot;.join(리스트)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join함수는 매개변수로 들어온 리스트에 있는 요소들을 하나하나 합쳐서 하나의 문자열로 바꾸고 리턴해줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, a = ['apple', 'banana', 'cake'] 라는 리스트가 있을 때 join을 사용하면 하나의 문자열로 리스트의 원소를 모두 보여주는 것이죠.&lt;/p&gt;
&lt;pre id=&quot;code_1651650459639&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;a = ['apple', 'banana', 'cake']

print(&quot;&quot;.join(a))
print(' '.join(a))
print('/'.join(a))
print('_'.join(a))
print('\n'.join(a))&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1651650472166&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;applebananacake
apple banana cake
apple/banana/cake
apple_banana_cake
apple
banana
cake&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분자를 사용하면 원소과 원소 사이에 구분자를 넣어서 문자열을 리턴해 줍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분자로 '\n' 을 사용하면 원소 사이사이 한 줄씩 줄바꿈도 넣을 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;join 함수를 잘 몰랐을 때는 반복문을 돌려서 하나하나 문자열을 추가해 주는 방법을 사용했었는데 이런 편리한 기능이 있다는 것을 이제야 알았네요..&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파이썬은 하면 할수록 만들어진 편리한 기능이 많은 거 같습니다!!&lt;/p&gt;</description>
      <category>개발일지/# TIL</category>
      <category>join</category>
      <category>Python</category>
      <category>리스트</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/94</guid>
      <comments>https://dbswjdrl88.tistory.com/94#entry94comment</comments>
      <pubDate>Wed, 4 May 2022 16:52:19 +0900</pubDate>
    </item>
    <item>
      <title>[TIL] Django를 쓰지 않고 mysql 서버에서 datetime의 default값을 사용하는 방법</title>
      <link>https://dbswjdrl88.tistory.com/93</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;TIMESTAMP와 DATETIME은 모두 자동으로 초기화를 할 수 있으며, 현재 시간값(current timestamp)으로 업데이트가 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DEFAULT 값에 CURRENT_TIMESTAMP 를 넣으면 디폴트 값으로 현재 시각을 넣을 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;created_at 과 updated_at을 모델에서 DateTimeField로 auto_now_add 혹은 auto_now 를 True로 주고 만들었기 때문에 장고를 이용하면 자동적으로 시간이 들어가게 되지만&amp;nbsp;DB-TABLE 에서 수동으로 데이터를 넣으려고 하면 updated_at, created_at 이 null 이기 때문에 에러가 나게 된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;110&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clWzKp/btrAzt0xCa7/KdkYkeNTRgjel50Q69VHpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clWzKp/btrAzt0xCa7/KdkYkeNTRgjel50Q69VHpK/img.png&quot; data-alt=&quot;수동으로 데이터를 저장할 시 nulll로 인해 에러가 발생.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clWzKp/btrAzt0xCa7/KdkYkeNTRgjel50Q69VHpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclWzKp%2FbtrAzt0xCa7%2FKdkYkeNTRgjel50Q69VHpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;110&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;수동으로 데이터를 저장할 시 nulll로 인해 에러가 발생.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때, 테이블에서 updated_at 과 created_at의 Type을 datetime 으로 주고 Default를 CURRENT_TIMESTAMP 로 바꿔주게 되면 수동으로 데이터를 저장해도 updated_at과 created_at이 현재 시각으로 잘 들어가게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;127&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NQzaj/btrAvGNS6NR/8jBHvrOnfJdnS9VpcSRxTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NQzaj/btrAvGNS6NR/8jBHvrOnfJdnS9VpcSRxTk/img.png&quot; data-alt=&quot;Default 값을 CURRENT_TIMESTAMP로 바꿔줍니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NQzaj/btrAvGNS6NR/8jBHvrOnfJdnS9VpcSRxTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNQzaj%2FbtrAvGNS6NR%2F8jBHvrOnfJdnS9VpcSRxTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;910&quot; height=&quot;127&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;127&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Default 값을 CURRENT_TIMESTAMP로 바꿔줍니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;105&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUwyjh/btrAyNdYjD7/IRQ0DwiElZOLeJnqU7yML1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUwyjh/btrAyNdYjD7/IRQ0DwiElZOLeJnqU7yML1/img.png&quot; data-alt=&quot;현재시각이 잘 들어가게 됩니다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUwyjh/btrAyNdYjD7/IRQ0DwiElZOLeJnqU7yML1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUwyjh%2FbtrAyNdYjD7%2FIRQ0DwiElZOLeJnqU7yML1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;105&quot; data-origin-width=&quot;627&quot; data-origin-height=&quot;105&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;현재시각이 잘 들어가게 됩니다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발일지/# TIL</category>
      <category>CURRENT_TIMESTAMP</category>
      <category>datetime</category>
      <category>default</category>
      <category>MySQL</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/93</guid>
      <comments>https://dbswjdrl88.tistory.com/93#entry93comment</comments>
      <pubDate>Wed, 27 Apr 2022 00:28:03 +0900</pubDate>
    </item>
    <item>
      <title>[Django] 모델 작성하기!</title>
      <link>https://dbswjdrl88.tistory.com/92</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;모델Model 작성하기&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;1. 사용할 데이터 확인&lt;br /&gt;2. 데이터 모델링&lt;br /&gt;3. 데이터에 맞는 Field 작성&lt;br /&gt;4. 모델 생성 및 변경사항 Django에 반영하기.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;1. 사용할 데이터 확인.&lt;br /&gt;먼저 모델에 들어갈 데이터가 어떤 것이 있는지 확인합니다.&lt;br /&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;265&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LRdjS/btrzUh8UTc2/eoSjHgBskYlCaknfK8GDtk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LRdjS/btrzUh8UTc2/eoSjHgBskYlCaknfK8GDtk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LRdjS/btrzUh8UTc2/eoSjHgBskYlCaknfK8GDtk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLRdjS%2FbtrzUh8UTc2%2FeoSjHgBskYlCaknfK8GDtk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;722&quot; height=&quot;265&quot; data-origin-width=&quot;722&quot; data-origin-height=&quot;265&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
food_detail을 보면 name, description, price, img_path 4가지로 구성되어 있고,&lt;br /&gt;name, description, img_path 는 문자열, price는 숫자로 되어 있습니다.&lt;br /&gt;&lt;br /&gt;2. 데이터 모델링.&lt;br /&gt;데이터를 확인했으면 다음은 모델을 작성해 줍니다.&lt;br /&gt;모든 모델은 class로 구성되고, 모델 클래스는 django의 models.Model을 상속받아서 만들어지게 됩니다.&lt;br /&gt;
&lt;pre id=&quot;code_1650447175765&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Menu(models.Model):
    name = models.CharField(max_length=50)
    description = models.CharField(max_length=100)
    price = models.IntegerField()
    img_path = models.CharField(max_length=255)
    
    def __str__(self):
    	return self.name&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;3. 데이터에 맞는 Field 작성.&lt;br /&gt;음식 이름을 저장할 구조를 만들어주고 각 데이터에 대한 필드를 지정해 줍니다.&lt;br /&gt;CharField는 저장할 최대 길이를 필수인수로 넘겨줘야 합니다. (max_length)&lt;br /&gt;가격은 숫자니까 IntegerField를 사용합니다.&lt;br /&gt;Menu 클래스를 하나의 문자열로 표현해 주기 위해서 __str__ 함수를 지정해 줄 수 있습니다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;4. 모델 생성 및 변경사항 Django에 반영하기.&lt;br /&gt;- 모델을 생성 시
&lt;pre id=&quot;code_1650447681681&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py makemigrations​&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;97&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FcDEN/btrzUjy2tpH/t3SwALJalZcJc55kHZKVd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FcDEN/btrzUjy2tpH/t3SwALJalZcJc55kHZKVd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FcDEN/btrzUjy2tpH/t3SwALJalZcJc55kHZKVd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFcDEN%2FbtrzUjy2tpH%2Ft3SwALJalZcJc55kHZKVd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;993&quot; height=&quot;97&quot; data-origin-width=&quot;993&quot; data-origin-height=&quot;97&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
makemigrations를 실행해서 모델을 생성 혹은 변경시킨 사항을 migration으로 저장합니다.&lt;br /&gt;&lt;br /&gt;- 생성한 모델 혹은 수정한 모델을 Django에 알려주기.&lt;br /&gt;
&lt;pre id=&quot;code_1650447723069&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;python manage.py migrate​&lt;/code&gt;&lt;/pre&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;119&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/owGvM/btrzVB0viRs/WErxfiQfZBty45slSbH16k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/owGvM/btrzVB0viRs/WErxfiQfZBty45slSbH16k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/owGvM/btrzVB0viRs/WErxfiQfZBty45slSbH16k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FowGvM%2FbtrzVB0viRs%2FWErxfiQfZBty45slSbH16k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;916&quot; height=&quot;119&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;119&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
migrate 하게되면 모델에서의 변경사항들과 데이터베이스의 스키마의 동기화가 이루어지게 됩니다.&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개발일지/# Django</category>
      <category>Django</category>
      <category>makemigrations</category>
      <category>Migrate</category>
      <category>Model</category>
      <author>lution88</author>
      <guid isPermaLink="true">https://dbswjdrl88.tistory.com/92</guid>
      <comments>https://dbswjdrl88.tistory.com/92#entry92comment</comments>
      <pubDate>Wed, 20 Apr 2022 18:51:10 +0900</pubDate>
    </item>
  </channel>
</rss>