새로 받아서 사용함( 새로 시작)
인크립트란
암호화
문제
- 보안X
- 무결성 깨짐
- 가용성
1. 보안 X


해결하려면 1234 암호화 해야한다
암호화를 키보드 기준 보낸 문자를 한 칸 내려 암호화 한다 하자
Ex) 1234를 보내고 싶어 qwer로 보내고 받는 사람은 qwer로 받고 한 칸 올려 1234 하면 된다.
문제
암호화 하면 C는 모른다 하지만 문제는 B도 모른다!
qwer로 바꿨는데 C: qwer, B: qwer로 받아서 모른다 왜? B는 모르는가?
키보드 아래로 내리면 된다는 것도 데이터기 때문에 이것 또한 보내야 한다!
복호화 하는 방법까지 보낼 수 없지 않냐?
B가 못 푸니까 암호화하는 방법 알려줘야 하는데 이것도 통신해야 한다는 문제가 있다.
인크립트 할 때
최초의 인크립트는 대칭키(잠구는 방식과 여는 방식이 같다 즉 열쇠가 1개라는 의미)

문제!
보안해결을 위해 인크립트하면 키 교환의 문제가 생긴다!
보안 X → E(대체키) → 키교환
2. 무결성 깨짐

A가 B한테 말을 타고 내용을 전달하러 가고있다.
C가 말 타고 가는 거 죽이고 5678로 바꿔서 보낸다면 B는 F4 F5 F6 F7 이렇게 알아볼것이다
우리 편인지 아닌지 확인할 수 없기 때문에!
신분을 알려도 아군인지 모른다! 기존 데이터 회손이 해결 안됨
즉
무결성깨짐 → 출처불명!
A한테 받았는지 C에게 받았는지 모른다
→
1, 2 못 지켜지면 자동적으로
- 가용성!
qwer이 키교환 안되면 쓸 수 있나 ? 못씀!
5678받으면 쓸 수 있나? .못씀 다르니까
정리
CIA
- C 보안x → E →키 교환
- I 무결성 깨짐 → 출처 불명
- A 가용성
지금의 문제 CIA가 하나도 지켜지지 않는다
신뢰성!
옛날에 큰 문제가 있는데 비잔틴 장군 문제

로마를 치기 위해서는 사방에서 한번에 공격을 해야하는데 ABCDEF로 공격을 할거다
A가 B한테 5시에 가자 B가 C한테 5시에 가자 C가 D한테 5시에 가자 막 했는데
문제는 중간에 누가 가로채서 10시라고 한다면 문제가 생기지 않겠는가
잘 갔다고 해도 믿을 수 없다.
해결
키 두 개로 해결한다
원래는 해결하기 위한 기법들이 역사적으로 있었다.
잘 못하면 크랙당한다(뚫린다) 계속 뚫리다가 4세데 암호화 동형 이라는게 있다.
일단 우리는 3세대 암호화 배우면 된다
3세대 전에서는 키 1개로 해결하려고 했다
3세대에서는 키 2개로 해결한다
2세대

키 교환의 문제 때문에 알고리즘으로 해결하려고 했다.
방식
자신만 알 수 있는 숫자 정한다
3,4는 교환 안하고 5만 교환한다
자기번호 * 공개된 번호 결과를 넘긴다
A는 상대 20 * 자기번호 60
B는 상대 15 * 자기번호 60
이걸 키로 한다
C는 알고리즘으로 A,B의 번호를 알 수 있는 문제가 있기에
그래서 개인 숫자를 엄청 길게 크게 만들어 해석하기 힘들게 한다!
3세대 암호는 더 쉽다 RSA(공개키 암호화방식)
CIA중 C(보안) 해결


- RSA의 기본
공개키, 비공개키가 있는데 잠군 키로는 열 수 없다
공개키로 잠구면 공개키로 열 수 없고 비공개키로 열 수 있고
비공개키로 잠구면 비공개키로 열 수 없고 공개키로 열 수 있다.
비 공개키는 자기만 알 수 있다!!
- 중요!!
수신자의 공개키로 잠군다
즉 A가 B공개키로 잠궈서 주면 B는 비공개키로 열 수 있고 C는 못연다!
핵심
1234를 A공개키로 잠구면 A만 열수 있다 이거는 통신이 아니다!
B공개키는 누구나 다 알 수 있다 그래서 B공개키로 잠구면 B만 열 수 있다!
C는 A,B의 공개키만 알 수 있는데 열어볼 수 없다!
CIA중 I(무결성) 문제
문제
A가 B한테 B의 공개키로 1234를 보냈다
C가 중간에 갈취해서 B공개키로 잠긴 것을 버리고
다시 만들어서 B 공개키로 잠구고 B한테 보내면 B는 잘 보낸줄 안다! 무결성 해결안됨!!
무결성 해결
인크림트 한번 더 함
즉 한번 더 잠군다
A의 개인키로!

그리고 프로토콜은 만든다
- 송신자의 공개키로 풀어본다( 누구나 풀 수있다) 풀었는데 안 풀려? A가 보낸게 아니니까 버려버린다! → 신원이 증명된다!
- B의 개인키로 풀기 안 풀리면 버리면 된다
잠구는 측 프로토콜
- 수신자의 공개키로 잠구기
- 자신의 개인키로 잠구기
- 전송(TCP로 보낸다(잘 받았다고 응답받기까지 모른다, 응답 하다 죽으면 받았다는 증거가 있나? 총 2번 응답해야한다 잘 받았다고 그래야 통신)) 3way TCP방식 →총3번 왔다 갔다 해야해서
- 1- A가 B한테 보내면 2- B가 잘 받았다고 통신 3- A가 받고 한번 더 B한테 알려줘서 받았다고 말 해줘야 한다! 그래서 총 3번
이러면 가용성 자동으로 해결됨!

2가지 더 말할거다

프로토콜을 아는데 못 한다면 → 1. 문법을 모르거나 2. 많이 안 쳐봐서 안 익숙하다
은행을 말해보자
트랜잭션 일의 최소 단위
- ssar 3000
- cos 5000
서비스 레이어에 하나의 트랜잭션 담는 것
상황
쌀이 코스한테 돈을 보낼 건데 통신으로 2000원을 보낸다
이거는 보안은 상관이 없지만 무결성은 필요하다!!
쌀이 2000 cos한테 보낼께 이거는 무조건 쌀이 보내야 하니까 무결성이 중요하다!
그래서 신분증 통장을 주면 보안카드를 준다 즉 비공개키를 준다(은행이 발급해준다)
인간세계에서 완벽하면 DB에다가 프라이머리키 1,2 해서 공개키를 저장한다
그리고 각자에게 개인키를 주고 은행은 버려버림 이게 공인인증서다!
2번 프라이머리키 찾아서 2000원(금액 정하기), 이체(정보심고) 이거를 인크립트해야한다!
보안이 아닌 출처(쌀의 개인키로 잠군다)(비번입력해라한다 한번 더 보안을 넣는다) 개인들은 개인키 잘 보관 못해서 비번 넣는다!
개인키 + 비번 이 있어야 보낼 수 있다
→ 은행이 보낸것 쌀의 공개키로 풀어보고 안 풀리면 버리고 풀리면 신원조회 됨!
HTTPS


블로그 서버가 있다
A가 post방식으로 비번 넣고 들어갈거다
ssar 1234 전송
그냥 http통신하면 누구나 다 훔쳐갈 수 있다 (Http는 평문을 보낸다 그냥 글자)
해결 뭘 만들어야 할까?
블로그가 공개키, 개인키를 안들어야 한다!
A가 던지면 https서버야? 공개키줘
- 최초의 요청에서 공개키를 받아온다
- 공개키로 암호화 (브라우저는 프로토콜이라 알아서 해준다 앱은 안해준다 적용해야한다)
- 이 정보는 개인키 가지고 있는 https서버만 볼 수 있다!!
이렇게 만들지는 않는다 왜? 블로그 서버가 비밀번호를 볼 수 있기 때문
불법 서버를 신뢰할 수 있냐? 못함
그래서 전 세계에서 신뢰할 수 있는 CA기관을 만든다
CA기관 대표적으로 은행 등이 있다
로직이 여기서 바뀐다
로직이 바뀐 것
CA가 돈을 받고 블로그한테 개인키, 공개키 준다


최초 요청하기 직전에 CA기관 사이트 주소를 받는다
CA기관한테 요청한다 공개키를
블로그입장에서는 출처확인은 안돼서 토큰으로 한다
우리는 세션으로 했음 J세션ID로
암호화는 공개키로 잠구고 신원을 JsessionId로 했다
이제부터 JsessionID 안 쓸거임
세션 안쓰는 이유는?
스티키세션 접착제 달아서 로드밸런스?

서버가 있는데 최소 request해서 jsessionid 받았다 이제는 id가질 때 마다 서버가 확인가능함
하지만 최대 100명이라면 101명이면 터진다 그래서 서버를 늘린다
DNS서버라는게 있는데 예들이 naver.com은 10.1.1.1 이라는 ip주소 가지고 있다.
브라우저에서 ip주소를 치지 않고 naver.com을 친다
바로 통신되지 않고 DNS서버로 요청 → ip받아서 때린다
문제
→ dns중 서버 자체가 늘어나면 문제가 생긴다
그래서 단일 진입점을 만들고 한다 이런 것을 로비서버라고 한다
DNS서버에 무조건 로비서버를 만든다 단일 진입점이 있어야 여러곳으로 보낼 수 있다
이런게 로드밸런서
L4라고 한다
트랜스포트계층이라 한다 다른서버로 라우팅 해주는 것
서버마다 세션이 있는데 1 서버에서 로그인해두고 다시 들어갈라는데 1 서버가 꽉 찼어 그러면 2 서버로 가는데 2 서버에는 로그인 또 해야한다!
래디스? 공유되는 서버쓴다고
캐시 데이터 베이스 (하드가 아닌 메모리에 접근할 수 있는)
이런게 스테이트풀 서버
세션이 없는게 스테이트 리스 서버
세션이 있는 서버는 무조건 스테이트풀 서버인가? 아니다
만약 헬스장 락카가 있는데 누가 놀러왔어 락카에 신발 놓고 왔어 가방은 버리고
놀러갔어 오늘 쓸 락카 달래 (오자마자) 물, 옷 보관하고 갈 때 락카 비우고 나간다 이런 것은 스테이트 리스 서버다
세션 있다고 전부 스테이트풀 서버라고 하지 않는다.!
서버 공유하는
ajax로 클라이언트가 서버한테 요청할 수 있는데 세션은 날린적이 없다(JS코드에 넣지 않음)
ajax를 같은 도메인에서 날렸다
만약 프론트 서버가 다른다면 도메인이 다르다면 세션id브라우저가 들고가지 않는다.!
자동을 들고가지 않는다 js코드로 브라우저 쿠키영역에 jsessionid꺼내서 직접 보내야 한다!
자바 스크립트 공격해서 쿠키 훔쳐갈까봐 브라우저가 못하게함
쿠키에는 js에 접근할 수 없다 http only설정이 있는데
세션은 설정도 못하게 막아뒀다!
지금은 세션쓰면 편하지 하지만 앱으로 통신한다면 jsessionid자동으로 옮겨지나? 안 옮겨짐
직접 옮겨야 한다! 할 수 는 있다.
브라우저에서 js로 다 조진 통신에 세션id하면 안된다는 것임
그래서 토큰으로 통신한다!
jsonWebToken왜 쓰냐? 프론트 종류가 엄청 많다! 어떨 때는 세션이 먹고 어떨때는 세션이 안 먹고
서버를 여러개 만들 수 없다
서버를 하나로 통일하기 위해서 jsonWebToken 사용한다!
서버 스케일아웃 이야기 하면 좋다 ! 서버늘어나면 세션 유지가 안된다! 레디스로 해결할 수는 있는데 안 되는 곳도 있기 때문에
jsonWebToken사용하면 안되는 것도 있는데 이런 것은 어떻해요 물어본다면 지금은 몰라도됨
문제 !
react하면
시작
JWT


서버가 있으면 계속 늘릴 수 있다
단일 진입점이 (LB) 가 있으면 상관 없다
세션 사용하지 않는다
브라우저에 로컬 스토리지에 JWT저장한다
개인정보 상세보기 할 때 리퀘스트 해더 어솔라이제이션에 담아서 JWT보낸다
어솔라이제이션에 JWT있는지 확인하고 있으면 자기 공개키로 풀어서 풀리면 데이터 신뢰할 수 있다.
권한체크는 2번으로 찾아보면 된다
세션은 세션에 저장하는 것(클라이언트 상태)
JWT는 토큰에 저장한다
모든 서버마다 공개키만 가지고 있으면 된다는 것임 클라이언트가 토큰안에 있으니까
원래 브라우저는 요청되면 세션에 저장한다 세션 영역의 락카 쿠키로 준다 reqeust할 때 마다 jsessionid를 들고 간다
상태를 토큰에 심어둘 수 있다 서버는 스테이스 리스서버가 된다
신뢰할 수 있나? 그래서 서버 개인키로 잠군 것 (지가 만들어야 확인할 수 있으니까)
질문
JWT는 대칭키로 만들 수 있을까?
JWT서버가 만들고 서버가 푼다
굳이 대칭키로도 만들 수도 있다! 내가 잠구고 내가 푸니까 키교환 필요없으니까
하지만 RSA 필요한 경우가 있다 그래서 오스를 사용한다!
서버가 클라이언트 상태 저장하지 않는다
클라이언트 상태를 private key로 잠구면 된다 JWT
전 세계 프로토콜이니까 어솔라이제이션에 담아보낸다
중요 (서버만 알 수 있는 pk가지면 된다)
jWT란
전자서명을 통해서 인증하는 방식
특징
서명에 클라이언트 상태를 저장한다
대칭키로하면 나만 볼 수 있다.
암호화의 목적이 아닌 전자 서명의 목적이 있으니까
JWT누구나 볼 수 있다. 절대 비밀번호 들어가면 안된다!!!!
오스

대리인 요청하고 인증서를 주고 내가 상대방에게 인증서를 주면 상대방은 인증서를 신뢰할 수 없다.

그러면 200은 은행가서 뽑아줘
두번째로
은행이 개인키로 잠궜어
내가 인증서 받고 누군가에게 대신 뽑아달라해 인증서 확인하고
은행에 1억을 받았어
이 1억을 나한테 주면 된다
만약
대칭키라면 바로 확인 못함
은행가서 확인하고 1억 받았어 돌려주면 끝이다
공개키 기반 방식이라면
은행에 갈 필요가 없다
대칭키 기반 방식이라면
은행에 가야한다
오스2.0?
의미!
대리인에게 위임한다!
그러면 공개키 기반 어디까지가 오스인가?
누군가와 은행 왔다 갔다 할 수 있으면 오스 상태
공개키 받고 누구
대칭키라면
누군가가 은행가서 맞아? 물어보고 맞다하면 오스 상태
내 일을 누군가에 위임한다 로그인이 오스가 아니다!!!
누군가한테 내 정보를 대신 접근할 수 있게 위임하는 것
은행이 리소스(자원)을 가지고 있는데 (자원서버)
나 (리소스 오너 리소스의 주인이라 한다)
스프링 서버가 누군가다(클라이언트 서버라 한다, 대리인)
원래는 내가 클라이언트 서버인데
리소스 오너가 클라이언트에게 리소스에 접근할 수 있게 하는 것!
로그인의 목적은
나와 누군가와 통신할 수 있게 하는게 로그인의 목적이다
카카오 로그인
오스 로그인은 결국 대리인관계를 만든것임 누군가와 은행의 관계 누군가는 나를 신뢰할 수 있게됨 인증서를 받아왔고 그거를 주고 누군가가 인증서를 확인했기 때문에!
누군가 입장에서는 인증서를 받았을 때 나를 신뢰할 수는 없지만 은행갔을 때 나를 신뢰할 수 있다.


RSA
왜 직접 만드냐? 모든 os사가 대칭키로 만들어서 그럼
공개키로 만든다면 직접만드는 과정은 빠질거임!! AccessToken받자마자 공개키로 열어보면 끝난다.
오오스 사마다 다 다르다!!
중요 대칭키로 만들었냐? 공개키로 만들었냐?
딱 하나 안되는게 있는데 배신자 찾기 안됨
A (10시 공격) → B(10시공격) → C(10시공격) → D(5시공격)
지금까지는 서버를 믿는 거임 믿을 수 있다는 전제하에
막는 방법
10시 공격을 A가 BCD에 다 보내 그 다음 B가 메시지 A받은거 + 자기도 보내 ACD에게
C도 다 보낸다 5시공격 ABD에게 D도 다 보낸다 10시공격 ABC
전체 데이터의 50% 넘은 데이터가 맞는 것이다! 전부 다 보내면 쁘락지 찾을 수 있다.
이게 블록체인이다
하지만 배신자가 50%를 넘으면 뚫린다!!
비트코인 채굴기가
정답을 만들어둠 5자리
2 라 한다면 → 어떤 난수를 발생시켰는데 5자리중 01000 나오면 채굴 성공, 00100은 실패
최대 99999 인데 특정 숫자보다 크면 채굴 아니면 실패
1씩 는다면 컴퓨터 성능이 좋으면 빨리 캐는데
난수로 랜덤으로 특정 조건 넘어가면 채굴
뭐가 더 쉬울까?
채굴의 속도는 난이도에 따라 달라진다
난이도가 높아져야지 갑자기 채굴 안됨
블록체인은 알고리즘이 10분으로 정해둠
node 즉 서버가 있다. 2개로는 서버 실행 안하고 3개 이상있어야 실행함
소형 컴퓨터는 좋은 컴퓨터 채굴경쟁에서 진다 그래서 작은 컴퓨터가 노드에 붙어서 나눠서 돌린다
만약 슈퍼컴퓨터 협동한다면 더빠르다 그래서 난이도를 높여버린다.
채굴한것이 난수다.
전 세계의 node의 50%를 중국이 들고있다.
퍼트려 놓으면 장점
- 배신자 못만든다 최소 50%는 되야하니까 독점막으려고
문제는
- 구글이 바로 뚫을 수 있다. 양자컴퓨터 있어서
이제 하는 것
1. JWT 인증
2. Stream API 수업
3. 플러터!!
- 그림그리기
- 데이터통신 퍼블리싱!! (상태관리 MVVM)
4. OAuth2.0
5. 통합테스트
6. API 문서24일 발표!!25일부터 새로운 프로젝트!!
- 프론트앤드
- 백엔드
Share article