Today I learned
오늘은 어제 공부한 미들웨어를 한 번 더 학습하고 Access Token, Refresh Token에 대해서 실습을 진행하면서 학습했다
아직도 확실하게 나의 지식으로 만들지 못했다 더 많이 실습하고 학습해야겠다 그리고 SQL과 ORM Sequelize에 대해서 학습을 진행했다 내일은 이번 주에 학습한 것을 사용해서 저번에 진행한 개인과제에서 회원가입과 로그인 Token을 가지고
회원을 인증하는 부분을 추가하면서 학습을 진행할 예정이다!!
Access Token, Refresh Token
Access Token이란?
Access Token은 사용자의 권한이 확인 되었을 경우 해당 사용자를 인증하는 용도로 발급하게 됩니다
이전에 저희가 구현하였던 Cookie로 jwt를 발급하고 설정한 Expire 기간이 지날 때 인증이 만료되게 하는 것 또한 Access Token이라고 부를 수 있다
사용자가 Access Token을 가지고 인증을 요청할 경우 Token을 생성할 때 사용한 비밀키를 가지고 인증하기 때문에 복잡한 설계 없이 코드를 구현할 수 있고, 여러 분기를 거치지 않아도 된다
Access Token의 경우 Stateless즉 Node.js 서버가 죽었다 살아나더라도 동일한 동작을 하는 방식이다 jwt를 이용해 사용자의 인증 여부는 확인할 수 있지만 처음 발급한 사용자 본인인지 확인할 수 없다
Access Token은 그 자체로도 사용자를 인증하는 모든 정보를 가지고 있다 그렇기 때문에 토큰을 가지고 있는 시간이 늘어날수록 탈취되었을 때 피해가 더욱 커진다
만약 토큰이 탈취되었다고 인지하더라도 해당 토큰이 탈취된 토큰인지 알 수 없다 그리고 고의적으로 만료 시킬 수도 없다 언제든 사용자의 토큰이 탈취될 수 있다고 생각하고 피해를 최소화할 수 있는 방향으로 개발을 진행해야 한다
Refresh Token이란?
Refesh Token은 Access Token처럼 해당하는 사용자의 모든 인증 정보를 관리하는 것이 아니고 특정한 사용자가 Access Token을 발급받을 수 있게 하기 위한 용도로만 사용한다
Refesh Token은 사용자의 인증정보를 사용자가 가지고 있는 것이 아니고 서버에서 해당 사용자의 정보를 저장소 또는 별도의 데이터베이스에 저장하여 관리한다 그렇기 때문에 서버에서 특정 Token만료가 필요할 경우 저장된 토큰을 제거하여 사용자의 인증 여부를 언제든지 제어 가능하다
Access Token을 바로 발급하지 않고 Refesh Token을 거쳐서 Access Token을 발급하면 사용자에게 발급한 토큰이 탈취당할 경우 피해를 최소화하기 위해서 사용한다
실제 사용하는 OTP와 같이 짧은 시간 내에서만 인증 정보를 사용할 수 있게 하고 주기적으로 재발급하여 토큰이 유출되어도 짧은 기간 동안만 사용 가능하도록 하여 피해를 최소화 가능하다
토큰은 언제든지 탈취될 수 있다고 생각하고 탈취를 막을 수 없다면 탈취된 토큰을 사용할 수 있는 시간을 줄여서 피해를 막는 게 좋다
우리가 사용해야 하는 인증방식은!?
현재 상황에 가장 좋은 최선의 선택을 하는 것이 중요
프로젝트를 빠르게 구현해야 하거나 사용자의 요청에 대한 인증을 최소화하기 위해서는 Access Token을 사용하는 게 좋다고 생각하고 보안성을 중요하게 생각하고 서버를 조금 더 탄탄하게 구성해야 할 경우는 Refresh Token을 사용하는게
좋다고 생각한다
미들웨어
미들웨어는 무엇일까?
웹서버에서 요청받을 때 모든 요청에 대해서 공통적인 처리를 하고 싶은 경우가 발생할 수 있다 미들웨어를 통해 웹서버의 요청/응답에 대해 공통적으로 관리가 가능하다
예를 들어서 모든 요청에 대해서 로그를 남겨 확인하고 싶은 경우
이 외 승인된 사용자만 API를 접근할 수 있게 만들고 싶을 때도 해당될 수 있다
이런 기능적인 부분 외에도 아주 기본적인 미들웨어로, 브라우저가 보낸 데이터를 우리가 쉽게 사용할 수 있게
바꿔주는 미들웨어도 존재한다
다른 웹서버에도 이런 게 있을까?
가장 유명한 웹서버 Apache, Nginx 두 웹서버 모두 “모듈”이라는 개념을 가지고 있는데 미들웨어와 아주 유사하다
요즘은 어디서나 볼 수 있는 보안 연결 방법인 HTTPS를 지원하기 위해서 https 모듈을 추가하고 모든 요청과 응답을 기록하고 싶다면 로깅을 해주는 모듈을 추가하면 돈다
express.js의 미들웨어와 같은 개념이다
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
urlencoded : form-urlencoded라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어
json : JSON이라는 규격의 body 데이터를 손쉽게 코드에서 사용할 수 있게 도와주는 미들웨어
더 많은 미들웨어가 있지만 오늘 학습은 이 두 가지를 사용해보자!
SQL
SQL이란?
데이터를 아무리 많이 모아놓더라도 활용하지 않으면 가치가 없다 조건에 맞는 데이터를 활용할 수 있어야 하고 끊임없이 변하는 내용을 지속적으로 삽입, 수정, 삭제, 조회가 가능해야 한다 그런 상황에서 데이터를 어떻게 관리해야 할지 고민한 결과 모든 데이터들을 공통적으로 관리할 수 있는 표준 언어인 SQL이 탄생했다
생성, 삽입, 조회 명령문을 SQL(Structured Query Language)이라고 한다
SQL의 종류
- DDL (Data Definition Language)
- DDL은 데이터를 정의할 때 사용하는 언어로 테이블이나 데이터베이스를 생성, 수정, 삭제와 같은 행위를
할때 사용한다 - CREATE
- DATABASE, TABLE, VIEW, INDEX 등을 생성할 때 사용한다
- DROP
- DATABASE, TABLE, VIEW, INDEX등을 삭제할 때 사용한다
- ALTER
- TABLE의 속성을 변경할 때 사용한다
- DDL은 데이터를 정의할 때 사용하는 언어로 테이블이나 데이터베이스를 생성, 수정, 삭제와 같은 행위를
- DML(Data Manopulation Language)
- DML은 데이터베이스에 데이터를 조작할 때 사용하는 언어이다 데이터를 저장, 삭제, 수정, 조회와 같은
행위를 한다 - SELECT
- 일반적으로 TABLE에서 원하는 데이터를 조회할 때 사용한다
- DB를 관리하면서 가장 많이 사용한다
- INSERT
- 테이블에 새로운 데이터를 삽입할 때 사용한다
- DELETE
- 테이블에서 특정한 조건에 맞는 데이터들을 삭제할 때 사용한다
- UPDATE
- 테이블에서 특정한 조건에 맞는 데이터들을 수정할 때 사용한다
- DML은 데이터베이스에 데이터를 조작할 때 사용하는 언어이다 데이터를 저장, 삭제, 수정, 조회와 같은
- DQL(Data Control Language)
- DQL은 데이터베이스에 대한 권한과 관련된 문법으로 특정 유저가 DB에 접근할 수 있는 권한을 설정할 때
사용한다 - COMMIT
- 데이터베이스의 작업이 정상적으로 완료되었음을 관리자에게 알려줄 때 사용한다
- 트랜잭션의 대한 개념을 알고 있다면 더욱 확실한 이해가 가능하다 트랜잭션을 학습해야겠다
- ROLLBACK
- 데이터베이스의 작업이 비정상적으로 완료되었음을 관리자에게 알려줄때 사용한다
- 트랜잭션의 대한 개념을 알고 있다면 더욱 확실한 이해가 가능하다 트랜잭션을 학습해야겠다
- GRANT
- 데이터베이스의 특정한 유저에게 사용 권한을 부여할 때 사용한다
- REVOKE
- 데이터베이스의 특정한 유저에게 사용 권한을 취소할 때 사용한다
- DQL은 데이터베이스에 대한 권한과 관련된 문법으로 특정 유저가 DB에 접근할 수 있는 권한을 설정할 때
Sequelize
시퀄라이즈(Sequelize)란?
시퀄라이즈는 DB작업을 쉽게 할 수 있도록 도와주는 ORM 라이브러리이다 ORM이란 자바스크립트 객체와 관계형 데이터베이스를 서로 연결해주는 도구이다
시궐라이즈(Sequelize) 설정
모듈 설치
npm i sequelize mysql2
npm i sequelize-cli
mysql2는 node.js에서 시퀄라이즈를 이용해 MySQL을 더욱 쉽게 조각할 수 있도록 해준다
sequelize-cli는 우리가 시퀄라이즈를 조금 더 쉽게 사용하도록 도와주는 도구이다
시퀄라이즈 사용 준비
npx sequelize init
해당 명령어를 입력하면 디렉터리와 파일들이 생성된다
내 프로젝트 폴더 이름
├── models
│ └── index.js
├── config
│ └── config.json
├── migrations
├── seeders
├── package-lock.json
└── package.json
- config
- CLI에 데이터베이스 연결 방법을 알려주는 구성 파일 포함
- models
- 프로젝트의 모든 모델을 포함합니다.
- index.js파일은 구현할 시퀄라이즈 모델을 편리하게 사용할 수 있게 해주는 파일이다 지우지 말자!
- migrations
- 모든 마이그레이션 파일 포함
- seeders
- 모든 시드 파일 포함
해당 폴더와 파일들은 절대로 옮기지 말자 sequelize-cil는 정해진 경로에 있는 파일을 사용하고 저장하기 때문에 임의로 옮기면 오작동한다!!
'과거공부모음' 카테고리의 다른 글
나의 개발일지 2022-12-22 TIL(Today I learned) - 개인과제 (0) | 2022.12.23 |
---|---|
나의 개발일지 TIL(Today I learned) - Sequelize (0) | 2022.12.21 |
나의 개발일지 TIL(Today I learned) - 미들웨어, nodemon, JWT, mongoose exec(), cookie, sesstion (0) | 2022.12.19 |
나의 개발일지 WIL(Weekly I learned) - node.js, express.js 게시판 API 서버 만들기 (0) | 2022.12.18 |
나의 개발일지 TIL(Today I learned) - iptables, 포트포워딩, pm2 (1) | 2022.12.16 |