본문 바로가기
개발이야기/server

DB, JWT, 프로젝트 구조

by 효우너 2020. 8. 24.
728x90
반응형

※이 포스팅은 sopt 26기 server part seminar 자료 바탕으로 작성되었으며, 복습용입니다.

1-1. ERD

ERD는 개체 관계 다이어그램으로,

말 그대로 개체간의 관계를 다이어그램을 표시해둔 것

(테이블을 생성하고 수정, 삭제, 연결 등을 할 수 있다!) 


2-1. 인증

인증이란, API 요청에 대해 사용 가능한 사용자인지 확인하는 절차

즉, 클라이언트가 주장하는 사용자와 같은 사용자인지 확인

ex) 아이디에 알맞는 비밀번호로 로그인


2-2. 인가

인가란, 사용자가 특정 자원에 대한 접근 권한이 있는지 권한 체크를 하는 것

즉, 클라이언트가 하고자 하는 작업이 해당 클라이언트에게 허가된 작업인지 확인

ex) 사용자의 권한 레벨에 따라 접근할 수 있는 부분 제한


2-3. 무상태 프로토콜

무상태 프로토콜이란, Stateless + Connectionless로 어떠한 상태도 유지하지 않음

로그인을 하면 해당하는 데이터 요청에 대해 일시적


2-4. 인증 방법

1) cookie

cookie클라이언트 로컬에 저장되는 키와 값이 들어있는 작은 데이터 파일

- 쿠키는 단순한 '키-값' 쌍 -> 클라이언트 로컬에 저장

- 일정 시간 동안 저장할 수 있고, 클라이언트 쪽에 300개까지 저장 가능

- 서버로부터 쿠키가 오면 웹 브라우저는 쿠키를 저장해두었다가 요청 시 브라우저가 자동으로 쿠키 같이 보냄

- 쿠키는 요청과 응답의 헤더에 저장됨

2) session

session일정 시간 동안 같은 브라우저로 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지하는 기술

- 웹 브라우저를 통해 웹 서버에 접속한 이후로 브라우저를 종료할 때 까지 유지되는 상태

- 클라이언트는 발급받은 세션 ID를 쿠키를 사용하여 저장하고 세션은 서버 메모리에 저장됨

- 서버 재시작되면 세션 데이터 사라짐

- 세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다 보면 서버의 메모리가 감당할 수 없어질 수가 있고 속도가 느려질 수 있음

 

쿠키

세션

저장위치

클라이언트

서버

보안

클라이언트 로컬에 저장되기 때문에 변질되거나 스나이핑 당할 수 있음

세션 ID만 저장/구분해서 서버에서 처리하기 때문에 비교적 보안성 좋음

만료

만료 시간을 정할 수 있지만 브라우저를 종료해도 계속해서 정보가 남아있음

브라우저가 종료되면 만료시간에 상관없이 삭제


2-5. token

Authorization Grant -> Access Token(server to client) -> Access Token(client to server) -> Protected Resource

 - 토큰 기반 인증 시스템을 사용하여 어플리케이션의 보안을 높일 수 있음

- 서버 여러대를 사용하여 요청 분산하고 제한된 서버에만 요청을 보내는 번거로움을 해결

- SNS 계정들을 이용하여 다른 웹서비스에서도 로그인할 수 있음

 


2-6. JWT

JWT란, 두 개체 사이에서 JSON 객체를 사용하여 정보를 안정성 있게 전달

- 가볍고 자가 수용적 (JWT 는 필요한 모든 정보를 자체적으로 지니고 있음) (JWT 시스템에서 발급된 토큰은 토큰 정보와 전달 할 정보, 토큰이 검증됐다는 것을 증명해주는 signature 를 포함)

- HTTP 헤더나 URI 파라미터를 이용해 전달 가능

- 다양한 프로그래밍 언어에서 지원

- HEADER, PAYLOAD, VERIFY SIGNATURE 로 이루어짐

- Payload 부분에는 토큰에 담을 정보를 담음 (Payload의 name : value 의 한 쌍의 ‘조각’ 을 클레임claim 이라고 부름 토큰에는 여러 개의 클레임 들을 넣을 수 있다)

*지정된 클레임 : 토큰에 대한 정보들을 담기 위하여 이름이 이미 정해진 클레임

*공개 클레임 :  충돌이 방지된 이름을 가져야 함 (클레임 이름으로 URI를 사용 )

*비공개 클레임 : 등록된 클레임도아니고, 공개된 클레임들도 아님 클라이언트와 서버 합의 하에 사용되는 클레임 이름들 (이름이 중복되어 충돌이 될 수 있으니 사용 시 유의)


2-7. JWT Module

jwt.sign(json data, secretKey, [options, callback]) 
- 토큰 생성 메소드 
- options에 algorithm(default: HS256), expiresIn, issuer, subject 등을 지정할 수 있음

jwt.verify(token, secretKey, [options, callback]) 
- 토큰 확인 메소드
const randToken = require('rand-token');
const jwt = require('jsonwebtoken');
const secretKey = require('../config/secretKey').secretKey;
const options = require('../config/secretKey').options;
const TOKEN_EXPIRED = -3;
const TOKEN_INVALID = -2;


module.exports = {
    sign: async (user) => {
        const payload = {
            idx: user.userIdx,
            name: user.name
        };
        const result = {
            token: jwt.sign(payload, secretKey, options),
            refreshToken: randToken.uid(256)
        };
        return result;
    },
    verify: async (token) => {
        let decoded;
        try {
            decoded = jwt.verify(token, secretKey);
        } catch (err) {
            if (err.message === 'jwt expired') {
                console.log('expired token');
                return TOKEN_EXPIRED;
            } else if (err.message === 'invalid token') {
                console.log('invalid token');
                console.log(TOKEN_INVALID);
                return TOKEN_INVALID;
            } else {
                console.log("invalid token");
                return TOKEN_INVALID;
            }
        }
        return decoded;
    }
}
const {token, _} = await jwt.sign(user);
    // 로그인이 성공적으로 마쳤다면 - LOGIN_SUCCESS 전달
    return res.status(statusCode.OK)
        .send(util.success(statusCode.OK, resMessage.LOGIN_SUCCESS, { accessToken : token}));
       
 routes/user.js에 추가되는 부분 예시

2-8. Refresh Token

- Access Token이 만료되었을 때 새로 발급해주는 열쇠

- Access Token과 함께 클라이언트에 발급

- 현재 액세스 토큰이 유효하지 않거나 만료될 때 새 액세스 토큰을 얻을 수 있음

- 실제로는 JWT 토큰의 형식 (로그인을 완료했을 때 Access Token과 동시에 발급되는 Refresh Token은 긴 유효기간을 가지면서, Access Token이 만료됐을 때 새로 발급해주는 열쇠가 된다..!)

- 기존의 Access Token만 있을 때보다 안전 


3-1. 프로젝트 구조

routes/

controller/

models/

middleware

특정 엔드포인트에 대한 
클라이언트 요청에

애플리케이션이 응답하는 
방법을 결정

모델로부터 요청된 데이터를 
얻어내거나,

사용자에게 알맞는 
HTTP Response를 전달

데이터베이스에 접근하여 
데이터를 받아오는 것

요청에 대한 응답을 하는 과정 중, 
중간 Middle에 특정한 목적을 
처리하기 위해 거쳐가는 메소드

 

728x90
반응형

'개발이야기 > server' 카테고리의 다른 글

Multer, AWS S3, Architecture  (0) 2020.08.24
REST API, API 문서  (0) 2020.08.24
Database, RDS  (0) 2020.08.24
Express, Routing  (0) 2020.05.23
Javascript  (0) 2020.05.10

댓글