일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Node.js
- array
- Queue
- npm
- webServlet
- OAuth
- 최단경로문제
- 전화영어
- 백엔드스쿨
- 백엔드공부
- 시급합니다
- BFS
- 내돈내산
- JavaScript
- 원격근무
- Spring
- 자료구조
- 프로젝트진행
- 자바스크립트
- 탄력근무
- 탐색알고리즘
- 개발자
- maven
- YBM전화영어
- 백엔드
- java
- 제로베이스
- OpenAPI프로젝트
- 교육철학과 교육사
- 그래프탐색
- Today
- Total
개발자취
TIL | RDB / Postgres / GraphQL / OAuth / 쿠키 / JWT 본문
RDB
기본 개념 1 | RDB란?
- RDB는 Relational DataBase로, 가장 고전적인 DB 모델로써 테이블을 생성하여 그에 따른 제약조건에 맞게 데이터를 저장한다. 이때, SQL문으로 데이터를 CRUD 할 수 있다.
- DB의 구성 요소
- data table의 가로줄 : 행 (row),
- data table의 세로줄 : 열 (column, attribute)
- data table 덩어리 : table(relation)
- row를 구별하는 값 : primary key
- 관계형 데이터베이스는 NoSQL과는 다르게 다른 테이블에서 참조할 수 있도록 relationship을 형성하고 있다. 그래서 RDB가 잘 짜여져만 있다면, 데이터 중복이 거의 없다. 이는 곧 일관성이 높다는 것을 의미한다. /*패캠 강의 인용, 위키백과*/
- 트랜잭션(transaction, 일반적인 뜻은 거래, DB용어로는 업무처리의 최소 단위) 4가지 특징 ACID
- Atomicity : 원자성 ; All or Nothing / 트랜잭션을 수행하는 것은 처리되거나, 처리되지 않거나로 구분된다.
- Consistency : 일관성 ; 트랜잭션을 수행하는 것을 기점으로 전과 후의 DB 상태가 동일해야한다.
- Isolation : 고립성 ; 한 트랜잭션이 동시에 수행되는 동안 서로 교차되거나 방해받지 않는다.
- Durability : 영구성 ; 완료된 트랜잭션은 DB에 영구적으로 보존되어야 한다.
- 대표적인 CRUD SQL문은 다음과 같다.
SELECT id, name FROM test_table;
INSER INTO users (name, 'cityId') VALUES ('Bobo', 1);
UPDATE users SET name = 'Coco' WHERE name = 'Bobo';
DELETE FROM users WHERE name = 'Coco';
기본개념 2 | ORM이란?
- ORM은 Object-relational mapping으로 데이터베이스의 테이블을 객체의 형태로 매핑해 다루는 것이다.
- Database에 들어있는 데이터를 매핑해서 가져오는 경우, relation을 object로 바꿔서 가져올 수 있다. 데이터를 가져오는 형식은 다음과 같다.
{
id: 1,
name: "Bobo",
cityId: 1,
}
GraphQL
Facebook에서 2015년에 발표한 API 규격으로, type system을 기본적으로 갖추고 있어서 REST API(resource를 종류별로 요청해야함)보다 훨씬 개발 과정이 안정적이다. GraphQL은 SDL(Scema Definition Language)과 타입 시스템을 포함하는 스펙이고, 방대하고 강력한 오픈 소스 툴들로 개발자로 하여금 양질의 개발 경험 개선을 기대할 수 있게 한다. GraphQL 쿼리는 클라이언트가 필요한 데이터의 구조를 지정해서 서버로부터 받아올 수 있고 불필요한 데이터를 받게되지 않도록 명시할 수 있다. 또한 쿼리의 형태가 매우 자유로우므로 클라이언트 개발시 매우 편리할 수 있다. /*패캠 강의 인용, 위키백과*/
기본개념 1 | Query
- 데이터 요청에 사용
- REST로 비유하면 GET과 동일한 과정
기본개념 2 | Mutation
- 데이터 변경에 사용
- REST로 비유하면 GET을 제외한 모든 작업(POST, DELETE, UPDATE)과 동일한 과정
type Car {
manufacturer: String
color: String
}
type Query { // Query : 예약어
cars(search: String): [Car] // 검색할 인자, 리턴으로 받을 Car 배열
}
OAuth
OAuth는 Open Authorization의 의미로, 인터넷 사용자들이 웹서비스에 비밀번호를 제공하지 않고 타 웹사이트로부터 자신의 정보를 접근할 수 있게 권한을 부여한다. 즉 접근권한 위임을 위한 개방형 표준이다. /*패캠 강의 인용, 위키백과*/
기본개념 1 | OAuth Flow
[Social Platform] -> Issue Acces Token ->
Server Verification(token accept->redirection) -> Save User Information(with platformId)
기본개념 2 | 구현 프로세스의 기본적 형태
2022.07.31 - [꾸시의 개발공부/Dev | 스터디] - TIL | 로그인 프로젝트 1
쿠키
MDN에 따르면, HTTP 쿠키(웹 쿠키, 브라우저 쿠키)는 서버가 사용자의 웹 브라우저에 전송하는 작은 데이터 조각으로 설명할 수 있다. 브라우저는 그 데이터 조각들을 저장해 놓았다가, 동일한 서버에 재 요청 시 저장된 데이터를 함께 전송한다. 쿠키는 두 요청이 동일한 브라우저에서 들어왔는지 아닌지를 판단할 때 주로 사용하는데, 이를 이용하면 사용자의 로그인 상태를 유지할 수 있다. 상태가 없는(stateless) HTTP 프로토콜에서 상태 정보를 기억시켜주기 때문이다. 쿠키 사용의 주 목적은 상태정보 기억이라고 요약할 수 있다.
기본개념 1 | 쿠키 개념
쿠키는 사용자가 특정 웹사이트를 방문하였을 때 서버가 사용자의 접속 환경에 전송하는 텍스트이다. 서버는 웹사이트에 방문한 유저의 정보를 기록할 수 있고, 이를 일정 기간동안 보관할 수 있다. 쿠키 사용 목적을 정리하면 다음과 같다.
- 세션 관리 (Session management) ; 서버에 저장해야하는 유저의 정보
- 개인화 (Personalization) ; 커스터마이징한 환경 세팅
- 트래킹 (Tracking) ; 유저의 접속 기록
기본개념 2 | 쿠키 구현
쿠키는 npm package인 cookie-parser를 통해 구현할 수 있다. 구현 형태는 다음과 같다.
var express = require('express')
var cookieParser = require('cookie-parser')
var app = express()
app.use(cookieParser())
app.get('/', function (req, res) {
// Cookies that have not been signed
console.log('Cookies: ', req.cookies)
// Cookies that have been signed
console.log('Signed Cookies: ', req.signedCookies)
})
app.listen(3000)
// curl command that sends an HTTP request with two cookies
// curl http://127.0.0.1:3000 --cookie "Cho=Kim;Greet=Hello"
JWT
JWT는 JSON web token으로, 선택적인 서명 및 선택적 암호화를 사용해 데이터를 만드는 인터넷 표준으로 구조는 헤더(header), 페이로드(payload), 서명(signature)으로 이루어져있고, 페이로드는 JSON 형식으로 데이터를 보관한다 또한 각 부분을 구분자 '.'으로 구분한다. /*위키백과 참고*/
기본개념 1 | JWT 구조
- 헤더(Header) ; 서명 알고리즘과 토큰 타입 명시
- 페이로드(Payload) ; 데이터
- 서명(Signature) ; verify signature
# 헤더
{
"alg": "HS256",
"typ": "JWT"
}
# 페이로드
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
# 서명
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
_NQMEJDD4r9WBcmvzYKvUiUw082bvKm5stAOcBBs0Yw
/*your-256-bit-secret*/ // secret base64 encoded에 따라 결과값이 또 달라짐.
)
# 결과
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.7ZnFn7fYv-DxvyZ-90YTqDpeIgxeqPd9OVME9YujUpA
기본개념 2 | Jsonwebtoken을 통한 JWT 서명
- jwt.sign(payload, secretOrPrivateKey, [options, callback])
(비동기) 콜백으로 error 혹은 JWT를 반환받음.
(동기) jwt를 string으로 반환받음
// RSA SHA256로 JWT 의 동기 서명
var privateKey = fs.readFileSync('private.key');
var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256'});
// 비동기 서명
jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256' }, function(err, token) {
console.log(token);
});
// 토큰 만료
jwt.sign({ // 1시간 이내 토큰 만료
exp: Math.floor(Date.now() / 1000) + (60 * 60),
data: 'foobar'
}, 'secret');
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: 60 * 60 });
//or even better:
jwt.sign({
data: 'foobar'
}, 'secret', { expiresIn: '1h' });
- jwt.verify(token, secretOrPublicKey, [options, callback])
(비동기) 콜백으로 함수가 비동기적으로 실행됨. 콜백은 서명이 유효하고 옵션적 만료, 토큰 대상, 혹은 토큰 발행자가 유효한 경우에 payload를 decoding한 것으로 응답함. 그렇지 못하다면 error로 응답함.
(동기) 콜백이 제공되지 않는 경우는 함수가 동기적으로 실행됨. 동기의 경우에는 서명이 유효하고 옵션적 만료, 토큰 대상, 혹은 토큰 발행자가 유효한 경우에 payload를 decoding해서 반환함. 그렇지 못하면 error를 throw함.
// verify a token symmetric - synchronous
var decoded = jwt.verify(token, 'shhhhh');
console.log(decoded.foo) // bar
// verify a token symmetric
jwt.verify(token, 'shhhhh', function(err, decoded) {
console.log(decoded.foo) // bar
});
// invalid token - synchronous
try {
var decoded = jwt.verify(token, 'wrong-secret');
} catch(err) {
// err
}
// invalid token
jwt.verify(token, 'wrong-secret', function(err, decoded) {
// err
// decoded undefined
});
// verify a token asymmetric
var cert = fs.readFileSync('public.pem'); // get public key
jwt.verify(token, cert, function(err, decoded) {
console.log(decoded.foo) // bar
});
// verify audience
var cert = fs.readFileSync('public.pem'); // get public key
jwt.verify(token, cert, { audience: 'urn:foo' }, function(err, decoded) {
// if audience mismatch, err == invalid audience
});
// verify issuer
var cert = fs.readFileSync('public.pem'); // get public key
jwt.verify(token, cert, { audience: 'urn:foo', issuer: 'urn:issuer' }, function(err, decoded) {
// if issuer mismatch, err == invalid issuer
});
// verify jwt id
var cert = fs.readFileSync('public.pem'); // get public key
jwt.verify(token, cert, { audience: 'urn:foo', issuer: 'urn:issuer', jwtid: 'jwtid' }, function(err, decoded) {
// if jwt id mismatch, err == invalid jwt id
});
// verify subject
var cert = fs.readFileSync('public.pem'); // get public key
jwt.verify(token, cert, { audience: 'urn:foo', issuer: 'urn:issuer', jwtid: 'jwtid', subject: 'subject' }, function(err, decoded) {
// if subject mismatch, err == invalid subject
});
// alg mismatch
var cert = fs.readFileSync('public.pem'); // get public key
jwt.verify(token, cert, { algorithms: ['RS256'] }, function (err, payload) {
// if token alg != RS256, err == invalid signature
});
// Verify using getKey callback
// Example uses https://github.com/auth0/node-jwks-rsa as a way to fetch the keys.
var jwksClient = require('jwks-rsa');
var client = jwksClient({
jwksUri: 'https://sandrino.auth0.com/.well-known/jwks.json'
});
function getKey(header, callback){
client.getSigningKey(header.kid, function(err, key) {
var signingKey = key.publicKey || key.rsaPublicKey;
callback(null, signingKey);
});
}
jwt.verify(token, getKey, options, function(err, decoded) {
console.log(decoded.foo) // bar
});
'개발 > Dev | 웹개발' 카테고리의 다른 글
TIL | 로그인 프로젝트 2 (0) | 2022.07.31 |
---|---|
TIL | 로그인 프로젝트 1 (0) | 2022.07.31 |
TIL | 토이프로젝트 4 - npm package maker (0) | 2022.07.27 |
TIL | 토이프로젝트 3 - Github 관리 CLI 만들기 (0) | 2022.07.27 |
TIL | 토이프로젝트 2 - 이미지 리사이징 서버 (0) | 2022.07.27 |