데브코스/강의 정리

인증과 인가/ 쿠키 vs 세션 vs JWT/ 유효기간

케케_ 2024. 9. 25. 18:49

인증과 인가

  • 인증 (=로그인) Authenticatioin
    • 가입된 유저임
  • 인가 Authorization
    • 관리자 / 고객에 따라 접근 가능 페이지가 다름
    • 관리자든 고객이든 인증을 통해 사이트에 가입된 사용자라는 걸 증명하는것
    • 인증 후에, 이 친구 혹시 이 페이지에 접근 권한이 있나?

 

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

 

쿠키 vs 세션 vs JWT

  • 쿠키
    • 로그인 -> 서버가 쿠키를 구움
    • 사용지 <-> 서버가 쿠키를 핑퐁
    • 장점 : 서버가 저장 X => 서버 저장 공간, HTTP       /        stateless => RESTful
    • 단점 : 보안 취약
  • 세션
    • 로그인 -> 서버가 금고를 만들어서, 정보 저장 그 금고 번호를 줌
    • 사용자 <-> 서버가 번호만 가지고 대화
    • 장점 : 보안이 비교적 좋음
    • 단점 : 서버가 저장 -> 서버 저장 공간 부담, stateless X
  • JWT (JSON Web Token)
    • 개념
      1. json 형태의 데이터를 안전하게 전송하기 위한 (웹에서 사용하는) 토큰
      2. cf. 토큰 : (인증용) 입장 가능한 유저야 / (인가용) 관리자 권한 & 일반 유저 권한
    • 장점
      1. 보안에 강하다  <= '암호화'가 되어 있다
      2. HTTP 특징을 잘 따름 = Stateless <= '서버가 상태를 저장하지 않음'
      3. 서버 부담을 줄여줄 수 있음
      4. cf.  토큰을 발행하는 서버를 따로 만들어줄 수 있음
    • 구조 jwt.io
      • 헤더: 토큰을 암호화하는데 사용한 알고리즘, 토큰의 형태(jwt)
      • 페이로드 : 사용자 정보 (이름, 주소, 핸드폰, ...비밀번호 X)
      • 서명 : 만약 페이로드 값이 바뀌면, 이 서명값 통째로 바뀌기 때문에 우리는 JWT를 믿고 사용 가능

 

 

jwt 설치

npm i jsonwebtoken

 

 

모듈 소환 및 서명(토큰 생성)

var jwt = require('jsonwebtoken'); //jwt 모듈

//토큰 생성 = 서명함(페이로드, 나만의 암호키)
var token = jwt.sign({ foo: 'bar' }, 'shhhhh');
  • 토큰 생성 = jwt 서명을 했다 (페이로드, 나만의 암호키)

 

검증 

성공하면 페이로드 값 확인 가능

var decoded = jwt.verify(token, "shhhhh"); //토큰과 시크릿키 값
console.log(decoded.foo); // bar

 

iat : 토큰이 발행된 시간

 

.env (environment : 환경 병수 '설정 값')

  • 개념 : 개발하다가 포트넘버, 데이터베이스 계정, 암호키, ..등등 외부에 유출되면 안되는 중요한 환경 변수들을 따로 관리하기 위한 파일
  • cf. 깃허브에 올라가면 안되는 값
  • .env 파일은 환경 변수 파일 -> 프로젝트 최상위 패키지에 존재

.env 파일에 키 정의

PRIVATE_KEY = "shhhhh" #jwt 암호키

 

 

위의 키 꺼내 쓰기

var jwt = require("jsonwebtoken");
var dotenv = require("dotenv");

dotenv.config();

var token = jwt.sign({ foo: "bar" }, process.env.privateKey);

var decoded = jwt.verify(token, process.env.privateKey); //토큰과 시크릿키 값
console.log(decoded.foo); // bar

 

 

 

유효기간

var jwt = require("jsonwebtoken");
var dotenv = require("dotenv");

dotenv.config();

var token = jwt.sign({ foo: "bar" }, process.env.privateKey, {
  expiresIn: "30m",
  issuer: "gimga",
});

var decoded = jwt.verify(token, process.env.privateKey); //토큰과 시크릿키 값
console.log(decoded.foo); // bar

 

'데브코스 > 강의 정리' 카테고리의 다른 글

API 설계 2  (1) 2024.09.30
API 설계2  (0) 2024.09.27
데브코스 정리 과제 - 유효성 검사  (0) 2024.09.24
6주차 db 연동  (1) 2024.09.23
5주차 데이터 베이스 GUI, 디비 연동, timezone 설정  (0) 2024.09.14