풀스택 개발 공부로그

Django Authentication

|

django user

User authentication in Django | Django documentation | Django

Django comes with a user authentication system. It handles user accounts, groups, permissions and cookie-based user sessions.

장고는 사용자 인증 시스템과 함께 제공된다. 사용자 계정, 그룹, 권한, 쿠기기반의 사용자 세션등을 다룬다.

overview

The Django authentication system handles both authentication and authorization. Briefly, authentication verifies a user is who they claim to be, and authorization determines what an authenticated user is allowed to do. Here the term authentication is used to refer to both tasks.

  • authentication : 사용자 인증
  • authorization : 권한 부여
    여기서 사용하는 authentication 라는 용어는 두가지 일 모두를 가리킨다.

The authentication system in Django aims to be very generic and doesn’t provide some features commonly found in web authentication systems. Solutions for some of these common problems have been implemented in third-party packages:

  • Password strength checking
  • Throttling of login attempts
  • Authentication against third-parties (OAuth, for example)
  • Object-level permissions

장고의 인증 시스템은 매우 일반적인 기능을 제공하지만 일부 기능을 제공하지 않습니다. 이에 대한 대안으로 third-party 패키지가 있습니다. 비밀번호 강도, 로그인 시도 제한, OAuth같은 인증 시스템 등

1. ’django.contrib.auth’ contains the core of the authentication framework, and its default models. 2. ’django.contrib.contenttypes’ is the Django content type system , which allows permissions to be associated with models you create.

With these settings in place, running the command manage.py migrate creates the necessary database tables for auth related models and permissions for any models defined in your installed apps.

인증과 관련된 모델과 권한들을 생성하기 위해서 manage.py migrate 명령 수행이 필요합니다.

Django authentication system

Using the Django authentication system | Django documentation | Django

User

objects

User objects are the core of the authentication system. They typically represent the people interacting with your site and are used to enable things like restricting access, registering user profiles, associating content with creators etc. Only one class of user exists in Django’s authentication framework, i.e., ‘superusers’ or admin ‘staff’ users are just user objects with special attributes set, not different classes of user objects. The primary attributes of the default user are:

from django.contrib.auth.models import User
user = User.objects.create_user('john', 'lennon@thebeatles.com', 'johnpassword')

Authentication in Web requests

Django uses sessions and middleware to hook the authentication system into request objects .

장고는 세션과 미들웨어를 사용하여 인증시스템과 request 객체를 연결합니다.

These provide a request.user attribute on every request which represents the current user. If the current user has not logged in, this attribute will be set to an instance of AnonymousUser , otherwise it will be an instance of User . You can tell them apart with is_authenticated , like so:

매 request요청마다 request.user에 현재 유저에 대한 정보가 담겨있습니다. 로그인이 되어있으면 User 인스턴스를, 로그인이 되어있지 않으면 AnonymousUser 인스턴스를 반환합니다.

How to log a user in

To log a user in, from a view, use login() . It takes an HttpRequest object and a User object. login() saves the user’s ID in the session, using Django’s session framework. Note that any data set during the anonymous session is retained in the session after a user logs in. This example shows how you might use both authenticate() and login() :

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        # Redirect to a success page.
        ...
    else:
        # Return an 'invalid login' error message.
        ...

POST를 통해 입력받은 username과 password를 사용하여 사용자 검증을 하고 통과한다면 이전에 받은 HttpRequest와 user정보를 login함수에 인자로 전달합니다.

DJango User Model

Django user model

Substituting a custom User model

Substituting a custom User model

Some kinds of projects may have authentication requirements for which Django’s built-in User model is not always appropriate. For instance, on some sites it makes more sense to use an email address as your identification token instead of a username.

장고에서 기본적으로 제공해주는 USER모델로 충분하지 않은 프로젝트들이 있습니다. 인증토큰으로 사용자이름대신 이메일 주소를 사용하는것 처럼 말입니다.

Django allows you to override the default user model by providing a value for the AUTH_USER_MODEL setting that references a custom model:

AUTH_USER_MODEL = myapp.MyUser

This dotted pair describes the name of the Django app (which must be in your INSTALLED_APPS), and the name of the Django model that you wish to use as your user model.

Unauthorized and Forbidden responses

Unauthorized and Forbidden responses

When an unauthenticated request is denied permission there are two different error codes that may be appropriate.

인증되지 않은 요청에 대해서 다음 두가지 에러코드가 적절합니다.

  • HTTP 401 Unauthorized
  • HTTP 403 Permission Denied

HTTP 401 responses must always include a WWW-Authenticate header, that instructs the client how to authenticate. HTTP 403 responses do not include the WWW-Authenticate header.

401 응답(해당 리소스에 유효한 인증 자격 증명이 없음)은 WWW-Authenticate 헤더가 있어야하고 클라이언트가 어떻게 인증해야하는지 알려줍니다. 403 응답(서버에 요청이 전달되었지만, 권한때문에 거절)에는 WWW-Authenticate 헤더가 포함되어있지 않습니다.

The kind of response that will be used depends on the authentication scheme. Although multiple authentication schemes may be in use, only one scheme may be used to determine the type of response. The first authentication class set on the view is used when determining the type of response.

Note that when a request may successfully authenticate, but still be denied permission to perform the request, in which case a 403 Permission Denied response will always be used, regardless of the authentication scheme.


17 Oct 2019 7:59 PM

Vue.js, Nuxt.js Plugins

|

vuejs plugins

Vue.js

Introduction

https://vuejs.org/v2/guide/plugins.html

Plugins usually add global-level functionality to Vue. There is no strictly defined scope for a plugin - there are typically several types of plugins:

plugins는 전역적인 수준에서 기능되록 뷰에 등록됩니다.

install and use

Use plugins by calling the Vue.use() global method. This has to be done before you start your app by calling new Vue():

// calls `MyPlugin.install(Vue)`
Vue.use(MyPlugin)

new Vue({
  //… options
})

You can optionally pass in some options:

Vue.use(MyPlugin, { someOption: true })

Nuxt js

Setup - Axios Module

install (nuxt.config.js)

// nuxt.config.js
module.exports = {
  modules: [
    @nuxtjs/axios’,
  ],

  axios: {
    // proxyHeaders: false
  }
}

Usage

asyncData

async asyncData({ $axios }) {
  const ip = await $axios.$get(http://icanhazip.com’)
  return { ip }
}

methods/created/mounted/etc

methods: {
	async fetchSomething() {
	const ip = await this.$axios.$get('http://icanhazip.com')
	this.ip = ip
	}
}

Extending axios

If you need to customize axios by registering interceptors and changing global config, you have to create a nuxt plugin.

커스터마이징이 필요하면 nuxt plugins를 사용

// nuxt.config.js
{
	modules: [
		'@nuxtjs/axios',
	],

	plugins: [
		'~/plugins/axios'
	]
}
//plugins/axios.js
export default function ({ $axios, redirect }) {
	$axios.onRequest(config => {
	console.log('Making request to ' + config.url)
})

$axios.onError(error => {
	const code = parseInt(error.response && error.response.status)
		if (code === 400) {
			redirect('/400')
		}
	})
}

참고 : Helpers - Axios Module

fetch style requests

Helpers - Axios Module

Axios plugin also supports fetch style requests with $ prefixed methods:

// Normal usage with axios
let data = (await $axios.get('...')).data

// Fetch Style
let data = await $axios.$get('...')
set headers

Helpers - Axios Module

set token

Helpers - Axios Module

eTag

|

Indexing

|

인덱스가 생성되면 테이블과 매핑된 또다른 테이블이 하나 생성된다. 테이블이 하나 더 생성됐는데 어떻게 더 빨라지나요 ? 인덱스 컬럼을 기준으로 소팅이 되어 저장이 되어있다. 보통 테이블은 물리적으로 흩어져 저장이 되어있다. 특정 조건의 데이터를 찾으려면 테이블 풀 스캔을 해야한다. 데이터 양이 방대해진다면 시간이 많이 걸린다. 인덱스가 테이블과 매핑되어있다. 인덱스에서 데이터들을 먼저 찾은 다음 매핑된 테이블로 가서 나머지 데이터들을 꺼내오는 방식이다.

2:38 어떤 컬럼을 인덱스로 설정해야 효율적일까 ? 특정조건부터 스캔을 한다.

  1. 조건(where)절에 자주 등장하는 컬럼을 인덱스로 설정하면 효율적
  2. order by 절에 자주 등장하는 컬럼을 인덱스로 지정, 인덱스는 소팅이되어 저장되어있기 때문에 인덱스에서 바로 꺼내서 사용할 수 있음
  3. 여러 컬럼을 조합해서 만들기도 함

3:35 인덱스의 단점 인덱스는 오브젝트이다. select는 빨라질지 몰라도 insert나 update는 느려진다. 정렬이 된 상태로 저장되어야 하기 때문에 어느자리에 insert할지 찾아서 저장해야한다. 또한 테이블만 하는것이 아니라 인덱스도 똑같이 해줘야하기 때문에.

4:09 결합인덱스 결합하는 컬럼들의 순서가 중요. where절에서 equal 조건으로 많이 쓰이는 컬럼, 분별력이 높은 컬럼들이 앞으로 오는게 효율적. 예를들어 성별보다는 아이디처럼 분별력이 높은것. -> 결합인덱스에서 컬럼의 분별력과 선두 위치 여부는 상관이 없습니다. 오히려 분별력이 낮은 컬럼이 선두에 위치하는 것이 index skip scan 측면에선 더 유리

5:05 인덱스 스캔방식 index range scan : 어떤 시작점 부터 특정 범위를 스캔하는 방식 index full scan, index skip scan , index fast full scan 등등이 있다.

5:25 인덱스를 탄다고 무조건 빨라지지는 않음, 손익분기점이 있다. 테이블이 가지고 있는 전체 데이터 양의 10에서 15프로 일때 효율적이고 그 이상일 떈 풀스캔이 더 빠르다.

VPC

|

0:55 aws에서 제공하는 서비스를 사용하기 위해서 리소스를 생성하면 어디에 위치시킬지 결정하는것이 vpc이다. 제공하는 서비스에 맞게끔 네트웍에 연결해야 한다. 정확하게 연결하지 않으면 고객에게 원하는 서비스를 제대로 제공하기 힘들다.

1:57 ec2를 예시로 소개

3:01 나만의 가상 데이터 센터를 구축하는것

4:23 private ip address 외부에서 접속할 수 있는 public address 가 아니라

4:48 커다란 네트웍을 만들고 난 뒤 서브넷이라는 작은단위로 공간들을 분리해서 가상머신을 위치하여 사용한다.

본 강연에서 다룰 내용

5:35 시작

6:43 단계별 구분 (ip 주소 범위 선택, 가용 영역(az)별 서브넷 설정, 인터넷으로 향하는 경로(route)만들기, vpc로/부터 의 트래픽 설정) 데이터 센터를 만들기 위해서는 내부적으로 사용할 수 있는 private ip address를 설정해야한다.

7:36 ip주소를 선택하는 단계 흔히 ip address를 표현하는 방식을 CIDR(사이더) range example

10:30 RFC 1918

11:24 규약을 지키지 않은

12:17 서브넷

12:35 aws는 리젼내에 복수개의 가용 영역, 즉 availability zone을 운영을 하면서 app의 가용성을 극대화 할 수 있도록 지원하고 있다. ap-northeast-2a,c

14:00 vpc 서브넷 권고사

15:06 인터넷 경로

15:55 management console

16:56 internet gateway 외부 세상으로 나가는 문 (igw) 그리고 특정 서브넷으로 트레픽을 보내고자 할 때 경로를 만들어주게 끔 routing table을 만들어준

18:00 0.0.0.0/0 anywhere VPC로 향하지 않는 모든것: 인터넷으로 보내

19:09 vpc 네트워크 보안

19:57 방화벽

21:19 security group : 어플리 케이션 구조

24:45 체크포인트

25:14 statefull

25:58 stateless

28:04 VPC의 연결 옵션

39:30 VPC및 다른 서비스

40:55 S3