
쇼핑몰 상품 볼 때 x
쇼핑몰 상품 바구니 담을 때 o
쇼핑몰 상품 구매
마이 페이지 등등
//세션 : (로그인이 되어 있는) 상태
ex) 같은 사이트 내에 관리자 / 고객에 따라 접근할 수 있는 페이지가 다름
관리자든 고객이든 인증을 통해서 사이트에 가입된 사용자라는 걸 증명 하는 것
인증 후에, 혹시 이사람 이 페이지 접근 권한 있나?
장점 : 서버가 저장 하지 않는다. (서버 저장공간 확보)
Stateless => RESTful 하다
단점 : 보안 취약
장점 : 보안 비교적 좋다(쿠키보다 좋음)
단점 : 서버가 저장 O => Stateless x
개념 : JSON 형태의 데이터를 안전하게 전송하기 위한 (웹에서 사용하는) 토큰
-> 토큰을 가진 사용자가 증명을 하기위한 수단
cf. 토큰: (인증용) 입장 가능한 유저야 / 관리자 권한 & 일반 유저 권한
장점
보안에 강하다. = 암호화가 되어 있다.
HTTP 특징을 잘 따랐다. = Stateless 하다 = 서버가 상태를 저장하지 않는다.
서버 부담 줄일 수 있고,
cf. 토큰을 발행하는 서버를 따로 만들어줄 수도 있음!
JWT에서 사용하는 암호화 알고리즘을 쓰면 남들 다 아는데 그게 암호화가 될까? 라는 생각을 했다. 하지만
PAYLOAD에 name 값을 바꿔보면서 알 수 있었다. 값을 바꾸는 순간 파란부분도 같이 바뀌는걸 알았다. VERIFY SIGNATURE 값이 계속 바뀌기 때문에 처음에 발행해준 보증서 같은 역할을 해서 페이로드 값을 외부에서 누군가 변경해도 시그니쳐 값이 같지 않아 안전하게 보안할 수 있다.
구조
헤더 : 토큰을 암호화하는 데 필요한 알고리즘, 토큰의 형태(JWT)
페이로드 : 사용자 정보 (이름, 주소, 휴대폰 번호, ...비밀번호x)
서명 : 만약 페이로드 값이 바뀌면, 이 서명값도 통째로 바뀌기 때문에 우리는 JWT를 믿고 사용한다.
jwt 모듈 소환
var jwt = require('jsonwebtoken');
서명 : 토큰 발행
var token = jwt.sign({ foo : 'bar'}, privatekey);
token 생성 = jwt 서명을 했다.! (페이로드, 나만의 암호키 ) + SHA256
검증
만약에 검증 성공하면, 페이로드 값을 확인할 수 있음!
var decoded = jwt.verify(token, privatekey);
개념 : 개발을 하시다가 포트넘버, 데이터베이스 계정, 암호키, ... 등등 외부에 유출되면 안되는 중요한 환경 변수들을 따로 관리하기 위한 파일
cf. 깃허브에 올라가면 안되는 값
파일 확장자가 : .env
cf. .txt, .jpg...