오늘 학습 내용
Chapter 11. [인스타그램] 검색과 로그인 기능 만들기
팔로우, 팔로워 목록 만들기
검색기능 만들기

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


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

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

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

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

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

-
권한 부여 과정
- 인증 코드 요청
- 클라이언트가 사전에 권한 서버로부터 발급한 클라이언트 ID, redirect_uri
- 정보와 함께response_type을 code로 지정하여 요청
- 로그인
- 권한 서버에서 로그인 페이지를 제공하고 리소스 소유자가 로그인
- 인증 코드 전달
- 로그인에 성공하면 권한 서버는 전달받은 redirect_uri로 인증 코드를 전달
- 엑세스 토큰 발급
- 클라이언트가 권한 부여 승인 코드를 통해 엑세스 토큰 (및 리프레시 토큰)을 발급받음
- 이때 사전에 권한 서버로부터 발급한 클라이언트 ID, 클라이언트 시크릿 (Client Secret) 정보필요
- 예시: 사용자가 웹사이트에서 Google로 로그인할 때.
-
- Resource Owner Password Credentials Grant (비밀번호 방식)
- 사용자가 클라이언트에 직접 자신의 자격 증명(사용자 이름과 비밀번호)을 제공
- 보안이 강력하지 않으며, 신뢰할 수 있는 클라이언트에서만 사용해야 함
- 예시: 트러스트된 모바일 애플리케이션.
-
- 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
기본 세팅 및 유저가 존재하는 경우 처리
-
- Naver Developers
- Naver Developers 사이트에서 애플리케이션 등록 후
- 애플리케이션 정보를 secret.json 파일에 보관
-
- settings.py 에 등록
```py
# OAuth
NAVER_CLIENT_ID = SECRET['naver']['client_id']
NAVER_SECRET = SECRET['naver']['secret']
```

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


- 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
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.
- detail.html에서 {% url 'profile:follow' object.pk %}
- 의 object.pk 가 '' (빈 문자열) 로 넘어감
- 원인
pk = kwargs.get['pk', 0] (문법 오류)
- 문법적으로 잘못됨 .get 은 함수이고, 함수 호출은
() 로 해야 하는데 대괄호 [] 를 썼음
- 수정하지 않으면, follow view 에서 자기 pk 를 못 읽음 → follow 기능 실패
- get_context_data() 에서 return data 누락
- Django는 context가 None이 됨, context 안의 object 도 없어짐
- detail 템플릿에서 object.pk 접근 시 → 비정상 값 처리
- 결국 object.pk 가 숫자가 아니라 "" 빈 문자열로 렌더링됨
- 해결
pk = kwargs.get('pk', 0)
- UserProfileView.get_context_data() 마지막 줄에 return 추가
라이브세션
1. Django에 대하여
2. URL 단축 서비스

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

- 장점
- 관리하기 쉽다.
- 변경 내역이 관리됨
- 코드랑 데이터베이스가 일치
- 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)
class Meta:
db_table = "short_url"

4
-
python manage.py showmigrations
- migration 적용 여부 확인
- python manage.py showmigrations shorten
-
python manage.py migrate shortener zero
- shortener migrate 취소 -> 적용 X
-
python code를 통해서 DB에 영향을 가해보자
- Django에서는 기본적으로 id라는 컬럼으로 숫자형 자동 증가 값을 기본 식별자(PK)로 제공한다.
- PK를 다른 컬럼을 수정할 수 있다
- PK 값을 임의로 할당할 수 있다 (비추)