JWT, Redis 를 이용한 인증 및 인가 실습

방명규·2024년 1월 1일
post-thumbnail

인증과 인가

  • 인증 (= 로그인)

    AUthentication
    "나.. 여기 가입된 유저야,."

쇼핑몰 상품 볼 때 x
쇼핑몰 상품 바구니 담을 때 o
쇼핑몰 상품 구매
마이 페이지 등등

//세션 : (로그인이 되어 있는) 상태

  • 인가

    Authorization

ex) 같은 사이트 내에 관리자 / 고객에 따라 접근할 수 있는 페이지가 다름

관리자든 고객이든 인증을 통해서 사이트에 가입된 사용자라는 걸 증명 하는 것

인증 후에, 혹시 이사람 이 페이지 접근 권한 있나?


쿠키 vs 세션 vs JWT

  • 쿠키

    1) 로그인 -> 서버가 쿠키를 구워준다.
    2) 사용자 <-> 서버가 쿠키를 핑퐁

장점 : 서버가 저장 하지 않는다. (서버 저장공간 확보)
Stateless => RESTful 하다
단점 : 보안 취약

  • 세션

    1) 로그인 -> 서버가 금고를 만들어서, 정보 저장 그 금고 번호를 준다.
    2) 사용자 <-> 서버가 번호만 가지고 대화

장점 : 보안 비교적 좋다(쿠키보다 좋음)
단점 : 서버가 저장 O => Stateless x

  • JWT(JSON Web Token)

개념 : JSON 형태의 데이터를 안전하게 전송하기 위한 (웹에서 사용하는) 토큰
-> 토큰을 가진 사용자가 증명을 하기위한 수단
cf. 토큰: (인증용) 입장 가능한 유저야 / 관리자 권한 & 일반 유저 권한

장점
보안에 강하다. = 암호화가 되어 있다.
HTTP 특징을 잘 따랐다. = Stateless 하다 = 서버가 상태를 저장하지 않는다.
서버 부담 줄일 수 있고,

cf. 토큰을 발행하는 서버를 따로 만들어줄 수도 있음!

업로드중..

JWT에서 사용하는 암호화 알고리즘을 쓰면 남들 다 아는데 그게 암호화가 될까? 라는 생각을 했다. 하지만
PAYLOAD에 name 값을 바꿔보면서 알 수 있었다. 값을 바꾸는 순간 파란부분도 같이 바뀌는걸 알았다. VERIFY SIGNATURE 값이 계속 바뀌기 때문에 처음에 발행해준 보증서 같은 역할을 해서 페이로드 값을 외부에서 누군가 변경해도 시그니쳐 값이 같지 않아 안전하게 보안할 수 있다.

구조
헤더 : 토큰을 암호화하는 데 필요한 알고리즘, 토큰의 형태(JWT)
페이로드 : 사용자 정보 (이름, 주소, 휴대폰 번호, ...비밀번호x)
서명 : 만약 페이로드 값이 바뀌면, 이 서명값도 통째로 바뀌기 때문에 우리는 JWT를 믿고 사용한다.

JWT 구현해보기

jwt 모듈 소환

var jwt = require('jsonwebtoken');

서명 : 토큰 발행

var token = jwt.sign({ foo : 'bar'}, privatekey);

token 생성 = jwt 서명을 했다.! (페이로드, 나만의 암호키 ) + SHA256

검증
만약에 검증 성공하면, 페이로드 값을 확인할 수 있음!

var decoded = jwt.verify(token, privatekey);

.env (환경 변수 '설정 값')

개념 : 개발을 하시다가 포트넘버, 데이터베이스 계정, 암호키, ... 등등 외부에 유출되면 안되는 중요한 환경 변수들을 따로 관리하기 위한 파일

cf. 깃허브에 올라가면 안되는 값

파일 확장자가 : .env
cf. .txt, .jpg...

profile
한줄

0개의 댓글