2025/11/18 Django - 11

김기훈·2025년 11월 18일

TIL

목록 보기
59/191

오늘 학습 내용

Chapter 11. [인스타그램] 검색과 로그인 기능 만들기


팔로우, 팔로워 목록 만들기

  • follower / following 두개를 버튼으로 만들기

  • BootStrap Modal

    • save changes 삭제
  • Modal 적용 및 연결

  • follower / following 목록


검색기능 만들기

  • font

  • 검색 기능 추가 1단계

  • 사용자가 입력한 검색 쿼리와 검색 타입에 따라
    • 사용자 또는 태그와 관련된 게시물을 검색하는 기능

  • user 출력 방식 변경 및 이름 클릭시 상세페이지로 넘어가기

자주 사용하는 style style.css에 넣기

  • tag 검색 이미지 보이기 / swiper 적용

OAuth2

  • OAuth2는 웹 애플리케이션, 데스크톱 애플리케이션, 모바일 애플리케이션, IoT 장치 등
    • 클라이언트가 제 3자 서비스를 안전하게 액세스할 수 있도록 허용하는 인증 및 권한 부여 프레임워크
  • 주로 사용자 비밀번호를 공유X, 다른 애플리케이션이 사용자 데이터를 안전하게 접근할 수 있게 설계
  • OAuth2는 많은 현대 애플리케이션에서 인증 및 권한 부여를 안전하게 처리하기 위한 표준같은 자리
    • 이 표준은 사용자 정보의 안전한 관리 및 액세스를 보장하며, 다양한 서비스와의 통합을 용이하게 함

OAuth2의 주요 개념 및 흐름

출처: itnext.io
    1. 리소스 소유자 (Resource Owner)
    • 리소스에 대한 액세스 권한을 가진 사용자
    • 리소스 소유자는 클라이언트가 자신의 리소스에 접근할 수 있도록 권한을 부여
    1. 클라이언트 (Client)
    • 리소스 소유자를 대신하여 리소스 서버에 요청을 보내는 애플리케이션
    • 이 클라이언트는 사용자의 리소스에 접근하기 위해 권한을 요청
    • 클라이언트는 OAuth2 프로토콜을 사용하여 권한 부여 토큰을 얻음
    1. 권한 부여 서버 (Authorization Server)
    • 클라이언트의 자격 증명을 확인
    • 적절한 권한 부여하면 권한 부여 토큰(Access Token)을 발급하는 서버
    1. 리소스 서버 (Resource Server)
    • 보호된 리소스를 호스팅하는 서버
    • 리소스 서버는 클라이언트가 전달하는 액세스 토큰을 검증하고, 유효한 경우 요청된 리소스를 제공

OAuth2 권한 부여 흐름 (Grant Types)

    1. Authorization Code Grant (권한 코드 방식)
  • 권한 부여 과정

      1. 인증 코드 요청
      • 클라이언트가 사전에 권한 서버로부터 발급한 클라이언트 ID, redirect_uri
        • 정보와 함께response_type을 code로 지정하여 요청
      1. 로그인
      • 권한 서버에서 로그인 페이지를 제공하고 리소스 소유자가 로그인
      1. 인증 코드 전달
      • 로그인에 성공하면 권한 서버는 전달받은 redirect_uri로 인증 코드를 전달
      1. 엑세스 토큰 발급
      • 클라이언트가 권한 부여 승인 코드를 통해 엑세스 토큰 (및 리프레시 토큰)을 발급받음
      • 이때 사전에 권한 서버로부터 발급한 클라이언트 ID, 클라이언트 시크릿 (Client Secret) 정보필요
    • 예시: 사용자가 웹사이트에서 Google로 로그인할 때.
    1. Resource Owner Password Credentials Grant (비밀번호 방식)
    • 사용자가 클라이언트에 직접 자신의 자격 증명(사용자 이름과 비밀번호)을 제공
    • 보안이 강력하지 않으며, 신뢰할 수 있는 클라이언트에서만 사용해야 함
    • 예시: 트러스트된 모바일 애플리케이션.
    1. Client Credentials Grant (클라이언트 자격 증명 방식)
    • 클라이언트가 자신의 자격 증명을 사용해 직접 리소스 서버에 액세스할 때 사용
      • 주로 애플리케이션 간 통신에서 사용
    • 예시: 서버 간 통신, API 호출

액세스 토큰 및 갱신 토큰

  • Access Token (액세스 토큰)
    • 리소스 서버에 접근할 수 있는 자격 증명
    • 클라이언트는 이를 사용하여 보호된 리소스에 접근 가능
  • Refresh Token (갱신 토큰)
    • 액세스 토큰이 만료되었을 때 새로운 액세스 토큰을 발급받기 위해 사용
    • 주로 오랜 기간 동안 리소스에 접근할 필요가 있을 때 사용됨
  • 범위(Scope)
    • 범위는 클라이언트가 리소스에 대한 어떤 작업을 수행할 수 있는지를 정의하는 문자열
    • 범위는 권한 서버에 의해 정의되며, 클라이언트는 특정 범위의 액세스 권한을 요청 가능
  • 인증 코드(Authorization Code)
    • 인증 코드는 클라이언트가 액세스 토큰을 얻기 위한 중간 단계로 사용되는 코드
    • 인증 코드 부여(Authorization Code Grant) 방식을 통해 권한 서버로부터 발급됨
      • 이를 사용하여 액세스 토큰과 리프레시 토큰을 얻을 수 있음

OAuth2의 사용 예

  • 소셜 로그인
    • 사용자가 자신의 Google, Facebook, GitHub 계정을 사용해 다른 웹사이트나 애플리케이션에 로그인
  • API 접근
    • 클라이언트가 사용자 데이터를 포함한 API에 접근할 때, OAuth2를 사용해 인증 및 권한을 부여

이해해보기

  • 유저가 OAuth2서버로 요청을 보내면 OAuth2서버는 Django서버로 토큰을 보냄
    • Django서버는 토큰이 어디서 왔는지 모름 OAuth2서버에 확인요청
      • 보낸게 맞다는 확인이 되면 유저데이터를 받아올 수 있음 그 후에,
        • Django 서버에서 OAuth2서버에서 받은 요청으로 로그인 함

네이버로 로그인

실습 1

기본 세팅 및 유저가 존재하는 경우 처리

    1. Naver Developers
    • Naver Developers 사이트에서 애플리케이션 등록 후
      • 애플리케이션 정보를 secret.json 파일에 보관
    1. settings.py 에 등록
      ```py
      # OAuth
      NAVER_CLIENT_ID = SECRET['naver']['client_id']
      NAVER_SECRET = SECRET['naver']['secret']
      ```

    1. NaverLogin API
    • 제공되는 API 명세서를 참고하여 코드를 작성

    1. poetry add requests
    • Django 서버에서 다시 OAuth2서버에 다시 요청을 하고 받아와야 해서 필요
    if NAVER_STATE != signing.loads(state):
        raise Http404
  • state는 암호화를 한 것, 다시한번 로드를 해서 맞는지 확인
    • 맞지 않다면 오류 발생


실습 2

유저가 존재하지 않는 경우 처리

  • 유저가 없는경우 닉네임을 입력하는 페이지로 가도록


  • NaverLoginRedirectView
    • 역할: 네이버 로그인 페이지로 사용자를 리디렉션
    • 설명get_redirect_url 메서드는 네이버 인증 URL을 생성
      • 이 URL에는 네이버로부터 인증을 요청하는 데 필요한 매개변수들이 포함
      • 매개변수로는 응답 유형, 클라이언트 ID, 리디렉트 URI, 상태 값(state)이 포함
  • naver_callback(request)
    • 역할: 네이버 로그인 콜백을 처리하는 함수입니다.
    • 설명: 네이버에서 인증 후 리디렉션되는 URL을 처리합니다.
      • 이 함수는 네이버로부터 전달된 인증 코드를 사용해 액세스 토큰을 얻음
        • 이를 통해 사용자 프로필 정보를 가져옴
      • 프로필 정보를 기반으로 사용자를 조회한 후, 사용자가 이미 존재하면 로그인 시킴
        • 존재하지 않으면 닉네임을 입력받기 위해 oauth_nickname 뷰로 리디렉션
  • oauth_nickname(request)
    • 역할: 새 사용자 등록 시, 닉네임을 입력받는 뷰입니다.
    • 설명: 네이버에서 받은 액세스 토큰을 사용하여 사용자 프로필 정보를 가져옴
      • 사용자가 이미 존재하지 않는다면 새 사용자로 등록, 등록이 완료되면 해당 사용자를 로그인시킴
  • get_naver_access_token(code, state)
    • 역할: 네이버로부터 액세스 토큰을 요청하는 함수입니다.
    • 설명: 네이버 API에 인증 코드를 사용해 액세스 토큰을 요청합니다.
      • 이 요청에는 클라이언트 ID, 클라이언트 시크릿, 인증 코드, 상태 값(state)이 포함
      • 요청 결과로 반환된 JSON 응답에서 액세스 토큰을 추출해 반환
  • get_naver_profile(access_token)
    • 역할: 네이버에서 사용자 프로필 정보를 가져오는 함수입니다.
    • 설명: 액세스 토큰을 사용해 네이버 API에서 사용자 프로필 정보를 요청합니다.
      • 이 정보에는 사용자 이메일, 이름 등 다양한 정보가 포함가능
      • 프로필 정보를 반환받아 사용자의 이메일을 추출하고 반환

Github 로그인

settings.py

# OAuth
GITHUB_CLIENT_ID = SECRET['github']['client_id']
GITHUB_SECRET = SECRET['github']['secret']


새롭게 알게된 내용

  • Django는 fields 가 아래 3가지만 허용
    • 리스트(list)
    • 튜플(tuple)
    • all 문자열
      • fields = ('nickname') = X / fields = ('nickname',) = O

어려운 내용(추가 학습 필요)

  • 네이버 로그인누르면 바로 로그인창만 가지고 닉네임을 입력하는 창이 안나옴
    • 다시 해봐야 할듯.(강의 19분부터 올 설명?)
  • github도 동일

오늘 발생한 문제(발생 했다면)

  • NoReverseMatch: Reverse for 'follow' with arguments '('',)' not found.
  • 문제: 기본 페이지는 문제X
  • Reverse for 'follow' with arguments '('',)' not found.
    • object.pk 가 빈 문자열('')
  • detail.html에서 {% url 'profile:follow' object.pk %}
    • 의 object.pk 가 '' (빈 문자열) 로 넘어감
  • 원인
      1. pk = kwargs.get['pk', 0] (문법 오류)
      • 문법적으로 잘못됨 .get 은 함수이고, 함수 호출은 () 로 해야 하는데 대괄호 [] 를 썼음
      • 수정하지 않으면, follow view 에서 자기 pk 를 못 읽음 → follow 기능 실패
      1. get_context_data() 에서 return data 누락
      • Django는 context가 None이 됨, context 안의 object 도 없어짐
      • detail 템플릿에서 object.pk 접근 시 → 비정상 값 처리
      • 결국 object.pk 가 숫자가 아니라 "" 빈 문자열로 렌더링됨
  • 해결
      1. pk = kwargs.get('pk', 0)
      1. UserProfileView.get_context_data() 마지막 줄에 return 추가


라이브세션

1. Django에 대하여

  • 현대적인 웹 은 좋지만 현재로서는 다 해결하기 힘들기 때문에

  • 장고에서 제공하는 기능으로 대체한다.


2. URL 단축 서비스

  • bit.ly/abc

    • short.ly/abc
  • 짧은 링크를 누르면 긴 링크로 리 다이렉트 해줌

  • bitly

  • DjangoLive/url_short 안에 config 디렉토리를 만듬

  • Python으로 먼저 원하는 데이터 구조 코딩
    • Migration 시스템 "구조에 맞게 테이블을 만들어줘"
    • SQL(=DDL)
    • 테이블 생성/수정/삭제

  • 장점
      1. 관리하기 쉽다.
      1. 변경 내역이 관리됨
      1. 코드랑 데이터베이스가 일치
      1. SQL을 잘 몰라도 된다

3

  • 장고의 기본앱을 사용하기 위해서는 마이그레이션을 적용하라는 뜻

  • 'shortener.apps.ShortenerConfig',

    • shortener app를 만들고 만들어진 apps.py 안에 클래스 이름을
    • INSTALLED_APPS에 등록(자세하게 등록)
  • URL 단축 서비스

    • 긴 URL -> 짧은 URL
      • 클라이언트 요청 (짧은 URL 값) -> 서버 리다이렉트(긴 URL)
      • 클라이언트 요청: biy.ly/x
  • 테이블 이름 생성 규칙: 앱이름 모델이름(소문자)

    • ex. app_name: shortener / model_name:shorturl
    • table_name: shortener_shorturl
  • class Meta: (필수 X)

# 테이블의 이름 지정 ![](https://velog.velcdn.com/images/nike6736/post/de8e3d17-dfba-411a-bcd8-df26f703ae40/image.png)

class Meta:
	db_table = "short_url"
    


4

  • python manage.py showmigrations

    • migration 적용 여부 확인
      • python manage.py showmigrations shorten
        • shorten의 적용 여부 확인
  • python manage.py migrate shortener zero

    • shortener migrate 취소 -> 적용 X
  • python code를 통해서 DB에 영향을 가해보자

  • Django에서는 기본적으로 id라는 컬럼으로 숫자형 자동 증가 값을 기본 식별자(PK)로 제공한다.
    • PK를 다른 컬럼을 수정할 수 있다
    • PK 값을 임의로 할당할 수 있다 (비추)
profile
안녕하세요.

0개의 댓글