9/25_25일차

자햐·2024년 9월 29일

교육

목록 보기
24/51

next()

channels.js validate 정리

정리된 channels.js






users.js validate 추가 + 전체 테스트

정리된 users.js




로그인 세션- 인증과 인가

로그인(인증) 세션이 만료되었습니다.

인증과 인가

  • 인증(authentication, = 로그인)

"나,, 여기 가입된 유저야!"

쇼핑몰 상품 볼 때? X
쇼핑몰 장바구니 담을 때 O
쇼핑몰 상품 구매
마이 페이지..

  • 인가(authorization)
    : 예시) 같은 사이트 내에 관리자/고객에 따라 접근할 수 있는 페이지가 다르다.
    관리자든 고객이든 인증을 통해서 사이트에 가입된 사용자라는 걸 증명하는건 인증.

인증 후에, 이 친구 혹시 이 페이지 접근 권한 있나? -> 살펴보는게 인가.

쿠키 세션 차이

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

쿠키 vs 세션 vs JWT

  • Cookie란,

    웹에서 서버와 클라이언트가 주고받는 데이터 중 하나
    정확히는 생성은 웹 서버가 해서 웹 브라우저 주면, 브라우저가 자기 메모리에 저장해두고, 다음에 같은 웹서버 방문할 때 쿠키 들고 요청하러 감.

1) 로그인 -> 서버가 쿠키를 구워줘요.
2) 사용자 <-> 서버가 쿠키를 핑퐁 (나 로그인 했었어!)

장점 : 서버에 저장이 x, 서버 저장 공간 아낄 수 o, stateless -> RESTful
단점 : 보안에 취약

  • Session이란,

    Cookie에 중요한 정보를 담지 말고, 중요한 정보는 서버에 저장해두고, 그 정보가 어딨는지 주소만 적어서 Cookie에 담자!
    쿠키에 넣어서 보내기엔 너무 중요한 내용은 서버가 가진 금고(Session)에 넣어 두고, 그 금고 번호(Session ID)만 쿠키에 넣어 통신함.

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

장점 : 보안 강해짐
단점 : 서버가 저장 O => 서버 저장 공간, Stateless X

보안에 취약한 점과 Stateless(상태 저장하지 않음)의 단점을 보완하여 나온 것 : JWT

JWT 개념, 특징 12

JWT = JSON Web Token

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

  • 장점

  1. 보안에 강하다. = 암호화가 되어 있다.
  2. 상태를 저장하지 않습니다. = Stateless하다. = Http 특징을 잘 따랐다.
  3. 서버 부담을 줄여줄 수 있음

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

  • 구조 (feat. jsw.io)

JWT 구조 (feat. jwt.io) 15

header : 무슨 암호화 알고리즘을 사용했는지, type이 어떤 타입인지
payload : 내가 보내는 data 부분
signature : 그래서 앞의 내용을 이렇게 보증한다는 뜻 (데이터를 바꿀 시, 서명값도 signature가 바뀌어져 들어옴. 바뀐 보증값을 서버는 받아주지 않음 - 보안용)

  • 구조 (feat. jsw.io)
    헤더 : 토큰을 암호화하는 데 사용한 알고리즘, 토큰의 형태(jwt)
    페이로드 : 사용자 정보(이름, 주소, 핸드폰, ... 비밀번호 X)
    서명 : 만약 페이로드 값이 바뀌면, 이 서명값이 통째로 바뀌기 때문에 우리는 JWT를 믿고 쓸 수 있다

JWT 인증-인가 절차 12

JWT 구현해보기 17

$ npm install jsonwebtoken 한 후

결과

iat : 토큰이 생성된 시간. 따라서 같은 내용으로 토큰 생성을 해도 생성시간이 바뀌므로 토큰의 글자는 바뀌게 된다.

.env

.env = environment : 환경 변수 "설정 값"

  • 개념
    : 개발을 하시다가 포트넘버, 데이터베이스 계정, 암호키, .. 등등
    외부에 유출되면 안 되는 중요한 환경 변수
    cf. 깃허브에 올라가면 안 되는 값

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

설치해보자
$ npm install dotenv 하기

.env 파일은 환경 변수 파일 -> 프로젝트 최상위 패키지에 존재!

.env 파일에 중요한 값을 넣어놓고 코드를 정리해보자

라는 식으로 활용할 수 있다.

youtube에 jwt 적용해보기

users.js

users.js에 모듈 추가



쿠키에다가 담아서 줘야하는데 (header)에다가
근데 일단 body값에다가 담았을 때 띄워지는지 확인하려고 postman에서 확인

cookie에다가(header)에다가 토큰 값을 보내주기 위해
res.cookie("token", token); 코드 추가.
body값에서 보내는 res.json({token : "token";}); 줄 삭제,

else{}문의 접근 제한 의미를 가지고 있는 status코드 404에서 403으로 수정.

Secure

HTTP
http://localhost:1234/login

HTTPS(Secure)
https://www.naver.com

cf.httpOnly(= 프론트엔드가 아니라 API호출"만" 허락할거니?)
: XSS 공격(프론트엔드 공격 : 웹 브라우저 js 접근 => 공격)

그래서 httpOnly 설정을 false가 아닌 true로 바꾸는 코드를 작성할 것

코드

결과

jwt 유효기간 설정

유효기간을 설정해줘야 한다

누가 토큰을 발행했는지도 알 수 있다
콘솔에 토큰을 찍어보고 jwt.io에서 내 토큰 정보를 확인해보자

exp(expiration)이 나와있고
30분 뒤로 설정이 되어있다.

이제 권한 확인, 인증/인가 등을 내용을 고민하며.. 프로젝트를 완성해 볼 것.

profile
산업과 예술의 만남에 있는 예비 개발자..

0개의 댓글