항해99 첫 주차에는 팀을 나눠 간단한(?) 프로젝트를 하나 진행했다.
우리팀은 4명이 한팀이 되어 프로젝트를 진행했다.
우리팀이 처음 구현하려 생각한 기능들은
- 로그인
- 로그아웃
- 회원탈퇴
- 유튜브 크롤링후 게시글 작성
- 게시글에 좋아요 구현
등이었다.
그중에 나는 로그인, 로그아웃, 회원탈퇴를 구현화했는데 팀원분들이 실력이 좋아서,
나는 그냥 기능 구현만 하고 팀원들이 만들어놓은 페이지에 버튼에 모달창만 뜨게 붙이면 됐다.
내가 구현한 기능들은 강의도 제공되고 기본적인 기능이라 어려움은 없었지만 숙련도와 머지하는 과정에서 발생한 오류때문에 간단한 기능을 구현하고 도와줄 수 있었지만 도와주지 못했다.
유튜브 크롤링 같은 부분에서는 유튜브에서 크롤링 방지를 두텁게 해놔서 영상을 긁어오는데에 어려움을 겪었다.
다른 라이브러리(?) 인터프리터(?) 같은걸 설치해서 해결한 듯 했다.
다른어려움은 pr을 날리고 머지하면서 날라가거나 줄이 바뀌는 코드들 때매 겪은 어려움이라 크게 어렵진 않은 듯 했다.
프로젝트 완성(?) 후 db와 연결하고 서버에 올리는 역할도 맡았다.
이전에 프로젝트 하던 것들 때문에 서버가 세팅되어 있어서 파일만 올리면 될 줄 알았는데,
유튜브 크롤링 하면서 설치한 패키지 때문에 app.py가 구동되지 않았다.
때문에 터미널에서 서버에 접속하여 pip install google-api-python-client 명령어로 모듈을 깔아줬다.
근데 또 깔기전에 파이썬 버전이 낮다고 해당 모듈을 못쓴다고 -_-;
해서 python -m pip install --upgrade pip 명령어로 업그레이드 후 모듈을 다시 설치하고 업로드했다.
또한 local에서는 구동이 되는데 서버에 올리니 로그인 기능이 작동하지 않았다.
로그인 여부등을 확인하는 것을 확인 했는데, db 문제는 없어보였고 local에서 구동하기 때문에 코드문제도 아니라고 생각했다. 이 문제는 로그인 토큰이 오가는데에 decode로 바꿔주는데 로컬에서는 decode가 없어야 하고 서버에서는 decode가 필요했다. 토큰 뒤에 decode('utf-8')을 붙이니 해결되었다.;;
원래 사전에 혼자 공부할때 계획한 프로그램이었기도 하고,
비어있는 기능도 많고, 내가 안한것도 많기 때문에 시간이 된다면 혼자서 처음부터 끝까지 구현할 계획이다.
-https://github.com/Jone4865/-_IYM-InsideYourMelody-
GitHub - Jone4865/-_IYM-InsideYourMelody-: Music Playlist
Music Playlist. Contribute to Jone4865/-_IYM-InsideYourMelody- development by creating an account on GitHub.
github.com
이하 JWT 토큰과 API 정리
JWT 토큰이란?
Authentication (인증) vs Authorization (인가)
- Authentication(인증): == 로그인, 아이디와 패스워드 등을 통해 특정 서비스에 일정권한이 주어진 사용자임을 인증을 받는 것.
- Authorization (인가): 사용자가 한번 인증을 받은 후에 그 사용자가 특정 리소스에 액세스할 수 있는지 여부를 결정하는 프로세스이다.
즉 네이버에 로그인으로 인증을 한 후 블로그에 글을 쓰거나 댓글을 다는 등 내 계정으로 '만' 할 수 있는 활동을 시도할 때, 네이버가 나의 로그인 여부를 보고 허가 해주는 것
매번 로그인 해주면 되지, 인가가 왜 필요한가??
1. 로그인은 꽤 무거운 작업이다. db에 저장된 사용자 계정의 해시값 등을 꺼내온 다음, 이것들이 사용자의 암호를 복잡한 알고리즘으로 계산한 값과 일치하는지 확인하는 과정 등을 거쳐야하기 때문이다.
2. 또한, 매 요청마다 아이디와 패스워드가 전송되는 것도 보안상 위험하다.
Session vs JWT
세션과 JWT는 인증보다 '인가'에 연관된 기술이다.
Session (세션)
전통적으로 많이 사용되어 온 방식으로, 서버 기반 인증방법이다.
세션 id를 사용해서 어떤 사용자가 서버에 로그인 되어있음이 지속되는 상태를 '세션'이라고 한다.
어떻게 인가를 하는가?
- 사용자가 로그인에 성공하면 세션을 발행한다.
- 그 세션을 브라우저에도 저장하고 (ex) 크롬에 session id로 쿠키 설정), 서버 메모리에도 저장한다.
(경우에 따라 하드디스크와 데이터베이스 등에 저장) - 인가가 필요한 요청을 보낼 때 서버에 세션값을 같이 보냄
- 서버는 메모리에 저장된 값과 세션값을 비교해서 맞는 값이 있으면 authorization
단점은?
- 세션이 서버에 저장되어있기 때문에 사용자가 동시 다중 접속할 때 메모리가 부족해진다.
- 서버가 재부팅되어야하는 상황이 오면 서버의 메모리에 저장된 세션이 모두 날아가고, 모든 사용자가 로그인이 튕겨서 다시 로그인해야 한다. (DB에 넣어둔 경우, 속도가 느려짐.)
- 확장성면에서 분산된 서버의 경우 세션 유지가 제대로 안되기 때문에 서버 확장이 어렵다. (불가능하진 않지만 복잡해짐)
JWT (JSON Web Token)
사용자가 로그인을 하면 토큰을 주는데, 이 토큰을 서버가 기억하고 있지 않는다.
(시간에 따라 바뀌는 어떤 상태값을 안 갖는 것 - stateless, 반대로 세션은 stateful)
- JWT Token 예: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

암호화된 3가지 데이터를 이어붙인 형태(aaa.bbb.ccc)로 구성되어 있다.
1. 헤더: 알고리즘(3번 서명 값을 만드는데 사용될 알고리즘이 지정 ex) HS256), type이 들어감 (언제나 JWT)
2. 페이로드: 토큰이 갖는 데이터
3. 서명 (signature): 1번 헤더에 정의된 알고리즘을 통해 암호화한 비밀 값으로 서버만 알고 있음
왜 세션을 대체하지는 못하는 것일까?
JWT는 세션처럼 모든 사용자들의 상태를 기억하고 있지 않다. 따라서 기억하는 대상들의 상태를 언제든 제어할 수 있지 않음!
예를 들어, 세션을 이용한 경우 한 기기에서만 로그인 가능한 서비스를 만들고 싶을 때, pc에서 로그인하면 핸드폰에서의 세션값은 사용못하게 하는 등 제어할 수 있음. 반면 JWT는 이미 줘버린 토큰을 뺏을 수 도 없음. 해커에게 토큰을 배앗겨도 토큰을 무효화할 방법도 없음.
해결방법?? 로그인시 accessToken, refreshToken 두 개의 토큰을 준다.
- accessToken: 매번 인가를 받을 때 사용하는 토큰. (보통 수명이 짧음)
- refreshToken: accessToken의 수명이 다했을 때 accessToken을 재발행 받기 위한 토큰 보통 2주정도 기간이 길게 잡힘
(누군가를 로그아웃시키려면 refeshToken을 db에서 지워버리면 되는데 그래도 accessToken의 수명 동안은 바로 차단할 방법은 없음)
출처 - https://velog.io/@syoung125/JWT-%ED%86%A0%ED%81%B0%EC%9D%B4%EB%9E%80
------------------------------------------------------------------------------------------------------------------------------------------------------
📍 API 연동 개념 및 사용하는 이유, 장점&단점
📌 API 연동
: 개발자가 새로운 애플리케이션 구성요소를 기존 아키텍처에 통합하는 방식을 간소화해 주는 API는 프로토콜 등을 정의하여 상호 작용을 하기 위한 인터페이스 사양을 의미한다
◾ function, method, operation 등으로 다양하게 불리는 '소프트웨어 컴포넌트'의 기능 및 입출력
→ cmd/터미널에서 Hello, world!라는 문자열을 출력하는 프로그램을 C언어로 작성할 때도 텍스트로 출력하는 printf API를 사용하여 작성하는 것
◾ 사양(specifiaction)만 정의하기 때문에 구현(implementation)과는 독립적
→ SDK(Software Development Kit) : API가 실제 기능 구현체인 라이브러리와 함께 제공되는 것
◾ 플러그인 형태로 설계된 API가 적용되면, 이미 작성되어 컴파일이 되고 완성된 프로그램에 수정없이 프로그램 기능을 추가하는 것이 가능
→ 구글, 네이버, 카카오 등의 IT회사에서는 사내 제품군들의 API를 제공하여 개발 편의를 돕고, 자사 제품을 쓰도록 유도함
📌 API 장점
◾ 비즈니스적 관점에서는 새로운 수익 채널 확보 및 기존 수익 채널 확장
◾ 비용 및 시간을 줄일 수 있음
📌 API 단점
◾ 정보 부족 및 정확성이 낮을 수 있고, 확장성이 낮을 수도 있음
◾ API 손상, 노출, 해킹시 데이터 유출 사고의 원인이 되므로 API 보안이 중요함
→ 신뢰할 수 있는 Identity에 할당된 토큰 사용 / 암호화 및 서명 사용 / 취약점을 확용하고 할당량 및 제한을 둠 / API 게이트웨이를 통한 트래픽 분석과 API 사용 방식 제어 및 분석 가능
📍 OpenAPI 호출(콜), API 인증키, API 규격
📌 API 릴리스 정책
① Private
: API를 내부에서만 사용할 수 있도록 함.
② Partner
: API를 특정 비즈니스 파트너와 공유하며, 품질 저하 없이 추가 수익원 창출 가능
③ Public (=OpenAPI)
: 모두에게 공개되는 OpenAPI는 제 3자가 API와 상호 작용하는 애플리케이션을 개발 가능
ex) 네이버 아이디 로그인, 네이버 캘린더, 네이버 지도 등
📌 API 인증키, API 규격
◾ API 인증키 : 인증된 사용자임을 나타내는 문자열로, API key가 있어야 계정의 권한을 실행할 수 있음
◾ API 규격 : 사용자로부터 요청(Request)을 하면, 결과값을 받아 Parsing
- 요청 방법 : REST, SOAP, XML-RPC 등의 형식
◾ WEB API : 웹 서버 또는 웹 브라우저를 위한 애플리케이션 프로그래밍 인터페이스로, HTTP 서비스이고 WEB 환경을 통해 제공되는 데이터 CRUD 인터페이스를 제공함
📍 API Gateway 개념
◾ API Gateway : API를 생성, 구성 및 배포
→ API 개발자는 API를 생성하고 배포하여 API Gateway에서 필요한 기능이 구현되도록 함 & 앱 개발자는 API Gateway에서 API 개발자가 생성한 WebSocet 또는 REST (Representational State Transfer) API를 호출
cf. REST API : 자원을 URI로 표시하고, HTTP Method를 이용하여 해당 자원을 받아주면 그 결과를 받음
* 참고) https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/api-gateway-basic-concept.html
출처: https://shinetech.tistory.com/16 [✨ IT 소유일기:티스토리]
'항해 99' 카테고리의 다른 글
항해99 - 5주차 후기 (0) | 2022.08.12 |
---|---|
항해99 - 4주차 후기 (0) | 2022.08.05 |
항해99 - 3주차 후기 (0) | 2022.07.29 |
항해99 - 2주차 후기 (0) | 2022.07.19 |
항해99 사전 공부 깃 강의 후기 (0) | 2022.07.12 |