(거의 아모레의 노예라고 할 수 있음)
그러니깐 👧🏻 '설화수에서 엄마꺼 영양크림 사고, 프리메라에서 내 에센스사고, 이니스프리에서 동생 선크림사고, 일리윤에서 바디로션 사고, 에스쁘아에서 파운데이션을 사려면 각각 홈페이지에 회원가입을 해야했다.' 그래서 등장했다 !
올리브여...ㅇ아 아니라
진짜 하기 싫은데, 해야지. 해내야지. 일어나 앉아
클라이언트('가영인가영'서비스 출시함), 인증기업(구글)에게 사용신청
사용신청서
기업체명: 나는가영
요청주소: www.가영인가영.com (로그인 성공시 접속할 주소 설정)
신청항목: 소셜로긴
요청항목: 아이디, 닉네임, 이메일 등등
인증기업(구글): 오.......얘네 불법사이트 아니지? 오케 오케 적합하니까 승인!
사용자: (가영인가영 방문)'우헤헤헿 엇 소셜로그인 해야지~~'
클라이언트(가영인가영): 인증 서버(구글)로 안내
사용자: 인증서버에서 로그인을 시도
[처음 소셜로그인하는 경우]
인증서버는 클라이언트(가영인가영)가 요청했던 항목을 바탕으로 정보를 알려주고 동의 여부를 물음
사용신청서
기업체명: 나는가영
요청주소: www.가영인가영.com (로그인 성공시 접속할 주소 설정)
신청항목: 소셜로긴
요청항목: 아이디, 닉네임, 이메일 등등
동의하면, 로그인에 성공 & 클라이언트(가영인가영)에게 해당 회원의 토큰을 발행
cf) 토큰(token)
클라이언트(가영인가영)는 전달받은 토큰(access_token)으로 자원 서버(구글)에서 사용자의 정보를 요청
자원서버(구글)는 인증토큰이 유효한지 확인 후에 요청한 정보(아이디, 닉네임, 이메일 등등)를 클라이언트(가영인가영)에게 전달
OAuth인증 절차 끝 !
그러니깐, 서울대학교에 입학을 하고 학생증을 발급받는 과정이 '인증'이고, 그 학생증을 가지고 도서관에 출입하는 과정이 '인가'
인터넷에서 인증과 인가는?
클라이언트(브라우저) -> request / response <- 서버
그럼 서버는 내가 과거에 request했던 내용을 다 기억하고 있을까?
Stateless(무상태성), HTTP통신에서 서버는 현재요청과 이전요청의 맥락을 기억하지 못함'
클라이언트 '야 ! 서버 나 가영이다 !'(request)
서버 '아, 그래 가영이 왔냐 !'(response)
며칠후
클라이언트 '야 ! 서버 뭐하냐 !'(request)
서버 '예? 누구신데 반말이시죠 ?'(response)
그래서,
클라이언트 "야 ! 서버 나 '가영'이라고 하는데 반갑다 !"(request)
서버 "아 ! 가영이구나 ! 앞으로도 계속 '가영'이라고 이름표를 붙여서 와줘"(response)
며칠후
클라이언트 www.가영인가영.com/가영 - "야 ! 서버 잘지냈어? "
서버 이름표(/가영)를 확인 "어 ! 가영아 오랜만이다 !"
이런식으로 다음에도 기억해야 할 상태(정보)가 있다면 정보 이름표(url)가 점점 길어질 수 밖에 없음
문제점 1. 개인정보가 담긴 url
문제점 2. 각 url에 해당하는 html 페이지를 생성하므로 서버 부하 가중
문제점 3. 다른 사이트 이동 혹은 로그아웃 시 기존의 데이터가 삭제됨
ㅇㅋㅇㅋ 그럼 이제
클라이언트 request 헤더에 ip주소를 담아서 요청
서버 ip주소를 보고 식별
엥? 그런데 만약에 내 컴퓨터에서 동생이 접속한다면?
서버는 모름...
문제점 1. 컴퓨터의 식별자이므로 사용자를 식별할 수 없음
문제점 2. 동적으로 IP주소를 할당하므로 바뀔 수도 있음
문제점 3. 방화벽, 프록시, 게이트웨이 등으로 실제 클라이언트의 IP주소를 알기 어려움
From: 사용자의 이메일 주소
User-Agent: 사용자의 브라우저
Refere: 사용자가 현재 링크를 타고 온 근원 페이지
Authrization: 사용자 이름과 비밀번호
문제점 1. 사용자 이름과 비밀번호를 쉽게 디코딩할 수 있음
문제점 2. 재전송 공격을 예방하지 못함
문제점 3. 가짜 서버의 위장에 취약
후....그냥 하지마 때려치워
(지친)클라이언트: username, password를 header에 담에서 로그인(request)
서버
며칠후
클라이언트: 쿠키를 가지고 있다가 다음 요청시 쿠키와 함께 다시 요청
서버: 쿠키에 담긴 세션ID와 세션저장소에 담긴 세션 ID를 비교해서 사용자 인가여부를 결정
문제점. 다중서버의 환경이라면?
해결방안 1. sticky session: 로드밸랜서가 클라이언트의 요청을 세션을 생성한 서버로만 전달
해결방안 2. session clustering: 모든 서버의 세션 동기화
해결방안 2. 별도의 세션 저장소 생성: Redis, Memcached 등
하.지.만 확장성이 떨어진다는 문제점은 해결하지 못함
JSON 포맷을 이용하여 사용자에 대한 속성을 저장하는 Claim 기반의 Web Token(인증에 필요한 정보들을 암호화시킨 JSON 토큰)
클라이언트는 username, password로 로그인을 요청
서버 인증절차를 거친 후 클라이언트에게 토큰을 발급
클라이언트는 토큰을 가지고 있다가 Authorization 헤더에 해당 토큰을 가지고 다시 요청
서버는 해당 비밀키로 무결성을 검증하고, 토큰의 유효성을 검증하고, 유저를 인가
웹, 모바일, 데스크탑 어플리케이션에서의 간단하고 표준적인 방법으로 보안 인가를 허용하기 위한 개방형 표준 프로토콜
1. Resource owner(자원 소유자-사용자)
2. Client(서비스 제공자)
3. Authorization server(인증을 처리하고 토큰을 발행하는 서버)
4. Resource server(자원 제공 서버)
사용자(Resource owner): 리소스를 소유하며 접근할 권한을 가지고 있고, 클라이언트에게 그 권한을 위임하는 주체(인증을 수행하는 주체)
웹브라우저(Client): 리소스 소유자 대신 위임 받은 권한으로 리소스를 요청하는 주체(권한을 위임받는 주체)구글
자세히 보면
사용자가 구글에 접근해서 아이디와 패스워드를 통해 인증을 받고
권한은 클라이언트가 받음(클라이언트는 권한을 인증받는 어느 과정에서도 관여하지 않음- 보안을 위함)
다음 접속할때는?
예전에 했던 팀프로젝트에서 구글로그인을 했었나? 찾아보던 중에 네이버랑 카카오 로그인했던거 발견..........
내 생에 첫 프로젝트 였음
나는 그 당시에 로그인과 회원가입 페이지를 맡음
코드는 엉망진창이긴함(리액트 안배운 상태에서 리액트로 프로젝트함ㅋㅋ)..... 그렇지만 생각보다 잘했음ㅋㅋ
백엔드 서버도 배포했었는데 헤로쿠여서 볼 수 없지만(그래서 유효성검사, 중복확인 기능은 다 살아있는데, 회원가입은 안됨), 프론트 배포는 아직 볼 수 있음
https://daily-coorder.vercel.app/
[참고]