- 로그인이 이루어지는 시점을 다이어그램으로 그려보기 << use ipad
- “진짜 이게 최선인지”
- id + password 들어가는 요소 + 흐름은 내부에서 사실 엄청 복잡함
- 세션 기반 인증, 토큰 기반 인증 ⭐
- 면접 단골
- 생각하지도 말고 그냥 입에서 튀어나와야함
- OAuth vs OpenID connect
- Openid connect를 더 많이 씀 (oath 를 확장)
유저 기능의 필요성과 활용
- 어플리케이션에 회원이 생기는거임
- 유저는 정말 많은 곳에 참조가 될것임
- 잘 설계하지 않으면, 전파될 수 있음
-
유저 기능의 역할
- 비회원, 회원
- 회원 → 개인화
- 비회원
- 장바구니 가능하지만 쿠기같은거 써야함
- 근데 비회원일때도 서비스 사용 대부분이 가능해야하는 제약조건이 많이 있음
- 맞춤형 서비스
- netflix, 유튜브
- 장바구니
- 장바구니 담은것 < → 실제 결제 전환율 계산 도 가능! 요즘은 데이터를 넓은 범위로 사용됨
- 은행서비스는 인증이 필수
- 민감한 정보를 다루기 때문에!
- 비회원, 회원
-
인증 (authentication) 개념
- 로그인 안에 인증이 포함됨!
- 인증 → 내가 본인이 맞는지 증명하는 것!
- 비닐번호
- 해싱이 필수 → 평문으로 저장하면 잡혀감..ㅋㅋㅋㅋ
- 해싱의 특징
- 단방향 암호화
- 복구가 불가능?!
- 대표적인 알고리즘
- SHA-256 (가장 많이 쓰임) → 걍 못품 (근데 양자컴퓨터 오면 maybe? 근데 양자 암호화도 개발되고 있음)
- 근데 암호화를 거쳐도, 많이 쓰이는 비닐번호는 털릴 수 있음 (해싱 결과는 항상 같기 때문에!)
- rainbow table?
- 보안
- 내 정보가 언제든지 털릴 수 있다는 점
- 털리면 상대방이 함부르 쓰지 못하게 해야 함
인증 vs 인가
- 인증
- 본인 확인
- 인가 authorization
- 너는 여기까지 할 수 있어! 접근 가능한 권한을 확인 + 부여
- 사용자가 뭘 할 수 있는지 결정하고 부여
- 항상 인증 이후!!!!
- header
- 너는 여기까지 할 수 있어! 접근 가능한 권한을 확인 + 부여
- 왜 분리?
- 유지보수 편리
- 로그인안에 둘다 들어가지만, 인가는 무조건 인증 이후

인증
- 잘못된 비닐번호를 입력했습니다 → 보안에 구멍!!!!
- ID가 맞다고 유추할 수 있음!!! → ID도 민감한 정보에 포함됨
- 되게 불편한데, 정보가 노출되지 않기 위해서!
- usercredential
- 로그인 시도 횟수, 마지막 로그인 시간 등
- 나눠서 관리 가능! → 어플리케이션 규모가 커졌을때 (msa 등 인증서버를 아예 따로 둘 수 있음)
- 유저 안에 roles
- 계층형 구조
- roles 많이 포함 (n개 가질 수 있음! <<< 그냥 외워라)
이매일과 비닐번호
- 불일치하면 실패 횟수를 증가
- 계정 잠금 → 카톡/매일 등으로 보냄
- 네이버가 잘되어있음 → 해외로그인: 로그인 성공했지만 실패로 쳐짐!!!
- id + pw 보통은 1000원도 안함 ㅋ
- 요즘은 아이디보단 이매일/전번 씀
- 아이디는 까먹기 쉬움
- 추가적인 인증 가능
- 남의 매일로 가입 못함 → 이매일 인증 거쳐야함 (인증과정이 좀 더 고도화됨)
- 전번은 유니크 x
- 전번 교체할 수 있음
인증 워크플로우
-
클라이언트도 검증을 해야함
-
공격
- 쿼리문으로 공격 가능 (sql injection?)

- 쿼리문으로 공격 가능 (sql injection?)
-
비즈니스 로직인 이유
- 기능 추가할 수 있음
- 예를 들면 새로운 회원은 쿠폰 발행할 수 있음
-
위는 보편적인 회원가입 플로우임
-
회원가입을 하면 기본적으로 잠겨있음
- 회원 상태 - 가입 대기중
- 최조 회원가입을 하면 이매일 인증을 하야함 → 활성화
- 비닐번호 재설정 이매일도 전송할 수 있어야 함
- redis 사용
로그인 워크플로
- session, token 발행해야함
- http 라서
- http 특징
- 무상태성, 비연결성 <<<<<<<<<<<< 바로 나와야함!!!!! 그래서 session, token 발행해야함
- 당연히 로그 남겨야함
stateless
- 다음 요청을 보낼때 로그인 했다는 것을 기억 못함
- 그러면 글을 쓸때 매번 내 이아디 +비번을 써야함
- 서버에서도 검증하는 기능 more expensive
- 그래서 로그인 됐다는 것을 기억하기 위해서 가장 많이 쓰는게 session, token임 <<<⭐
- session
- token
비연결성
- keep alive → 여기에 인증정보를 담을 수 없음
- tcp위에 올라감, 그래서 tcp에서 사용되는 것만 저장. 우리가 원하는 것을 저장할 수 없음
- 분산 인프라
- 클라이언트, 서버
- 로드 밸런서
- 인증을 거치고 난 후 로드 밸랜서로 감
세션
-
쿠키
클라이언트는 전달받은 1을 가지고 요청을 보냄! -
세션저장소 → 서버에서 저장!!!
- 인증 상태는 서버가 들고있음
-
클라이언트는 저 인증상태에 접속할 수 있는 id만 들고있음
- jsession id, session id → 쿠키에 담겨져 보냄
-
브라우저는 쿠키를 관리함
-
chrome dev tools → application →storage → cookies
- session storage - 창을 닫으면 사라짐
세션 쿠키 필수 옵션 테이블 다 알아야함
- 도메인이 같으면 무조건 담겨져서 나옴
- same site 이해하기 <<<<<
- same site None??
- Strict
- 같은 도메인/사이트에서만 쿠키 사용 가능
- Lax
- 기본 값
- 필요할때는 열려있음
- Get 요청에서는 쓸 수 있음, post같은 요청은 크로스 사이트를 허용하지 않음
- 얘를 쓰면 최소한의 보안정치를 사용할수있음
- document.cookie
- 콘솔창에 치면 쿠키 값 접근가능
- 근데 js 콘솔에서는 민감한거는 담지 않음!!
- 변경 못하는거는 http only 속성을 적용해야함<<<
서버에서 상태를 유지하는 것 자체가 단점
- scale up - 성능 up
- scale out - 서버 늘리기
글로벌 세션 저장소

- 이렇게 하면 모든 트래픽이 중앙으로 몰림
- 따로 관리하면, 반대로 다른 서버 세션들에 동기화 문제가 있음
- 스키티 세션 ⭐(알아야함)
- 분산된 처리에서 내 인증정보가 저장된 서버로만 요청 가능하게 고정 할 수 있음!!!!
- 근데 문제점: 1번 서버가 꽉 찼을 때
토큰
-
http header로 전송
- authorization header로 담아서 보냄 → 인증정보가 담긴 헤더다!
- 인증정보를 서버로 전달하기 위해서 보냄!
- 여기에 있는 토큰으로 인증
- 데이터를 토큰으로 변환하고 보내는거임
- authorization header로 담아서 보냄 → 인증정보가 담긴 헤더다!
-
민감한 정보 안담음!!!!!!!!!!!!!!!
- 유저 정보, 권한 등만 담음
-
나중에 더 자세히 볼꺼임
-
토큰 → 평문 알고리즘 있음 (서버에 있음)
- 복구화를 거쳐서 인증정보를 사용하는거임
- 그냥 메서드임
- 토근에 인증정보가있음
- 매 요청이 어느 서버로 가든 복구화가 가능! 그냥 메서드만 호출하면 되니까!
- 복구화를 거쳐서 인증정보를 사용하는거임
-
토큰이 탈취될때 문제
- 세션은 탈취되면 그냥 세션을 지우면 됨
- 하지만 토큰은 무효화될 수 없음 - 만료기간을 맘대로 바꿀 수 없음 (불변이라고 생각)
- 차이점 이해하기
-
세션보다 좀 더 까다로움
- 로그아웃이 좀 까다로움 → 토큰 관리 저장소 따로 관리 (redis)
- 토큰이 유효한지 보관할 수 있어야함
- 로그아웃이 좀 까다로움 → 토큰 관리 저장소 따로 관리 (redis)
-
두가지로분류
- access
- 인증정보 담음
- 유저 아이디, 등
- 만료기간있음
- 인증정보 담음
- refresh
- access token을 재발급하기 위한 정보만 담겨있음
- 탈취되더라도, 탈취한 사용자는 짧은 시간만 사용할 수 있음
- 브라우저에는 refresh token만 저장하는 경우가 많음
- 두개 같이 털리면? 그냥 해킹당하는거임
- 그래서 refresh token 1회용으로
- 보안
- access 만들떄 refresh도 만듬 (같이 재발급)
- refresh는 한번 재발급하면 기존거는 못씀
- 폐기된 refresh 토큰을 누가 사용하는거면 누가 탈취한거임 → 이때 그냥 다 잠그고 사용자가 본인인증을 하고 다시 받게 할수도있음
- access
-
클라이언트에 저장
-
만료기간 설정
-
https 사용
- 당연히 secure사용
-
저장위치주의
-
세션 vs 토큰 비교 테이블 외우기 ⭐
이것도 외워라…
- in memory db - redis
- fast
- 지원하는 자료형태가 엄청 많음
- no sql 안에 들어감 (굳이 분류하자면)
- 캐싱
토큰 기반 인증
토큰 상태를 저장하는 서버 따로 둘 수 있음음
쿠키
- 데이터의 작은 조각
- 쿠키의 구필수적으로 외워야하는것들
- domain
- path
- secure
- httponly
- samesite
- 어디서 만드냐
- 서버에서 보통 만듬 (클라이언트도 만들수있긴함)
- set cookie header에 담아서 전송
- 그러면 클라이언트가 쿠키 저장소에 보관
- 종류
- 세션 쿠키
- 영속 쿠키
- spring
- srting으로 저장, cookie data type 둘다 사용 가능
세션
- 클라이언트는 세션 아이디만 들고있음
- 쿠키로 전달
- set cookie
- 서버에서 생성
- response
- cookie
- 브라우저에서 서버에게 요청을
- request
- secure 보장은 필수임!!!
httpOnly

-
이 공격은 요즘 많이 없어지긴 함
-
만약에 이런 스크립트 공격이 통하면 그냥 망한거임
- 그정도로 너무 옛날 공격임
-
script 자체는 실행되는데 쿠키만 접근 못하는거임
-
SPA
- SEO 안됨 <<< 면접 단골질문
- 동적으로 화면 일부만 렌더링!!!!!!!!!! UX 좋음, but SEO는 떨어짐
- 단점을 극복하기 위해서 next.js
CSRF 공격
- 중간에서 탈취
- 막기 위해 samesite 옵션
- 하지만 완벽하진 않음
기본 인증
-
요즘 안씀
-
base 64
- 크기는 늘어남
-
인코딩, 암호화에는 차이가 있음
- 인코딩 - 데이터를 편리하게 전송하게 위해서
-
base64 url
- url 인코딩?
- 특수문자는 문제가 생김 (쿼리파라미터와 겹침)
- 그래서 다른걸로 변환시킴!
403
- 인증을 됐으나 리소스 접근 못함
대칭키 암호화 방식, 비대칭키 htttps/http 이거 면접떄알아야함…ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ handshake tcp 통신
JWT
- 토큰
- json 형태의 웹에서 사용하는 토큰
- payload에 절대 민감한 정보 담으면 안됨

-
이거 창에 띄워두고 내일 수업 듣기…!!! <<<<<<<<
-
권한을 빼는건 전파가 됨
- 필요한 최소한의 권한만 부여
role + policy 같이 무조건 적용해야함
flow

- in urls
- port is 80 by default
CORS는 면접 단골 질문 ㅠㅠ
- CORS는 왜 써야 하나요?
http
- 무상태성
- 비연결성
세션/토큰 혼합은 피라…
- Authorization Code Grant
- 서버 ←> 서버 소통도 가능해야함
- 보편적으로 가장 많이 쓰림

- spring security는 저 1번에 작동함!
- dispatcherservelet 도달 전에
- 이건 외워야함 ㅋㅋ
- 이걸 담당하는건 실제로 톰캣임 (servlet container)! principal, credential 외우기
-
세션
- 문제점
- 확장이 어렵다.
-
- 그래서 글로벌 세션 (인증 서버)를 따로 만들 수 있지만, 그러면 부하가 다 거기로 몰림
-
- sticky session - 로그인한 서버를 앞으로 요청에 올때 그 서버로만 가게끔 고정시키는거!
- 서버에 보관
- 카드
- 문제점
-
토큰
- 클라이언트에서 보관 (주최가 가장 큰 차이점!)
- 상대적으로 세션보다 인증정보 탈취에 취약함
- JWT 특성상 암호화되진 아놓고 인코딩됨 (base 64url)
- JWT
- 민감한 정보 담으면 안됨
- signature: 복구화가 거의 불가능한 단반향 암호화
- 구조는 걍 외워야함!!
- 만료 시간 꼭
- 만원짜리 떨어뜨리는것
- ㅋㅋ 그래서
-
http
- 비대칭키 대칭키 둘다?
3 tier architecture
spa?
- 요즘에 다 적용되어있음
react
- framework가 아니라…라이브러리다…ㅋ
- 다른 프레임워크랑 같이 사용할 수도 있음!
jwt
-
사실 토큰이라는건 아주 많지만 그냥 jwt가 가장 많이 쓰이는거임
-
payload가 아무리 늘어나도 signature는 안늘어난다! (길이가 고정됨)
-
대칭키, 비대칭키