청소 플랫폼 만들기 (8)
쿠키와 세션의 개념과 차이
프로그래머스공부하며 느낀 점
참조한 페이지
오늘도 찾아온 버그
company 테이블은 user 테이블을 참조하는데, 회사를 가진 사람이 탈퇴를 하려할때 아래와 같은 오류가 떴다.
{
"message": "SequelizeForeignKeyConstraintError:Cannot delete or update a parent row: a foreign key constraint fails (`adMinJun`.`companies`, CONSTRAINT `companies_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `User` (`userId`) ON UPDATE CASCADE)"
}
외래키 참조 때문에 삭제할 수 없다는 말이다.
기술적으로만 따졌을때는 ON DELETE CASCADE 로 자동으로 삭제되게 할 수 도 있으나, 생각해보니 탈퇴할때 등록한 업소가 모두 사라지면 환불등의 책임 소재가 너무 불분명해지니 가지고 있는 업소가 있으면 탈퇴가 불가능하게 만들고, 업소를 없애는 것에 뭔가 조건을 추가해야할 것같다.
우선은 등록된 업장이 있으면 탈퇴가 불가능하게 아래와 같은 에러를 추가했다.
const haveCompany = await this.companyRepository.companyId(user.userId);
if (haveCompany) {
throw new Error('등록된 업장이 있으면 탈퇴하실 수 없습니다.');
}
이후의 것은 팀 회의에서 봐야겠다.
nunjucks
프론트도 구현해야하는데 넌적스라는것이 리액트보다 상대적으로 쉽다고한다.
npm i nunjucks
참고로 npm 5 버전 이상부터는 --save
가 자동으로 적용되어 있다고 한다.
app.get('/', (req, res) => {
res.render('main.html', {
// error : __dirname + '/test.html'
// error : path.join(__dirname, 'test.html')
// complete : path.join(__dirname, 'template', 'test.html')
// complete : test.html or ./test.html
name: 'minjun',
age: 99,
});
});
app.use((req, res, next) => {
const error = new Error(`${req.method} ${req.url} 라우터가 없습니다.`);
error.status = 404;
next(error);
});
app.get와 app.use가 원래 반대 위치에 있었는데 그것만으로도 오류가 터졌다 사실 당연하다면 당연한거다...
내가 알고 있는 것
쿠키 : 브라우저에서 사용자의 인증정보, 페이지의 정보등을 저장해 두는 것
세션 : 현재 브라우저로 보고있는 페이지(부정확하다고 생각 됨)
찾아본 정보
쿠키와 세션 모두 HTTP의 특징인 비연결 Connectionless 과 무상태 Sateless 때문에 생긴 개념이다.
웹의 모든 활동을 비연결/무상태로 만들면 페이지 이동시마다 로그인을 하고, 체크한 것들이 모두 사라지기 때문이다.
그래서 나온 해결법이 쿠키 cookie 와 세션 session 이다.
쿠키는 사용자의 브라우저에 정보를 저장하기때문에 빠르다는 장점이 있다.
하지만 변조가 가능하고 보안에 취약하다.
세션은 클라이언트가 서버에 접속한 시점부터 브라우저를 종료하는 시점까지를 하나의 단위로 보고, 그 상태를 유지시키는 것이다.
쿠키보다 보안상 뛰어나지만 속도가 느리다.
자세한 차이를 보자
쿠키 Cookie
쿠키의 작동순서
1. 클라이언트가 웹페이지에 요청을 한다.
2. 웹페이지가 응답과 set-cookie를 준다.
3. 클라이언트는 로컬에 쿠키를 저장한다.
4. 서버에 다시 요청을 하거나 재방문시 요청과 쿠키를 같이 보낸다.
쿠키의 특징
1. 이름, 값, 만료일, 경로 정보를 가진다.
2. 클라이언트에 300개의 쿠키를 가질 수 있으며, 도메인당 20개의 쿠키를 가질 수 있다.
3. 쿠키의 제한은 4kB이다.
4. 쿠키는 HTTP Header로 전달되기 때문에 트래픽이 크게 발생한다.
5. 로그인, 결제 정보등이 담겨있는 경우가 많아서 보안문제가 생길 수 있다.
세션 Session
세션의 작동순서
1. 클라이언트가 웹페이가 요청을 한다.
2. 서버가 클라이언트의 쿠키안에 session-Id를 확인한다.(없다면 생성해서 set-cookie로 보낸다.)
3. 클라이언트는 서버에서 준 session Id를 쿠키로 저장한다.
4. 클라이언트가 재접속시 session Id를 전송한다.
세션의 특징
1. 세션 쿠키는 웹 페이지에 저장된다. 서버에 저장하므로 관리가 편하고 효율적이다.
2. 웹 컨테이너의 상태를 유지하기 위한 정보를 저장한다. (클라이언트마다 session Id를 발급하여 관리한다.)
3. 브라우저를 닫거나, 서버에서 삭제시에 사라지므로 쿠키보다 보안이 좋다.
4. 서버가 받쳐주는 한 제한이 없다. 반대로 서버의 저장 공간이 부족하면 사용이 곤란하다.
5. 로드 밸런싱 load balancinig과 시스템효율 측면에서 다루기가 어렵다.
로드 밸런싱
: 서버에서 트래픽을 분배하여 배포하는 방식
세션의 위의 특징을 보장하기 위해서는 아래의 요소를 따라야한다.
1. 비밀보장 Confidentiality : 서버 이외에는 세션 데이터를 해석할 수 없어야한다.
2. 데이터 진실성 Data Integrity : 서버와 별개로 세션 데이터를 조작할 수 없어야한다.
3. 진본성 Authenticity : 서버외에는 올바른 세션을 시작할 수 없어야한다.
요약하면 쿠키와 세션 모두 서버와 클라이언트 간의 비연결/무결성의 단점을 깨기위해 나온 것이다.
쿠키는 정보를 클라이언트가 가지는 대신 트래픽과 보안측면에서 약하고,
세션은 클라이언트에게 session Id라는 최소한의 정보를 주기 때문에 보안측면에서 강하지만, 서버측의 부담이 늘어난다.
간단해 보인다.
n자리수를 10^n
으로 나누고 소숫점을 버리면 될것같다.
자릿수를 어떻게 구하는지 생각이 안나서 검색했는데 .length
다... 너무 간단한걸 생각해내지 못했다.
Number 타입에는 length 프로퍼티가 없다고한다...
또 거듭제곱도 ^
이 아니라 **
로 바꿔야겠다.
이런...
하아... 컴퓨터는 소수를 완전히 저장 못하는데 거기서 당해버렸다...
i === 1 인경우에만 올림을 할수도 있지만 뭔가 깔끔하지 못하다.
거기에 0이 중간에 들어있으면 또 그거대로 오류가 생긴다.
두가지 방법으로 구현이 가능하지만 가독성도 i를찍어서 몇번째 루프인지 보기에도 위에가 낫다.
function solution(n) {
var answer = 0;
const digitOfN = n.toString().length;
let diviedDigits = n;
console.log('0',answer)
for (let i = digitOfN; i > 0; i--) {
let digitNow = Math.floor(diviedDigits / (10 ** (i-1)));
console.log('1',diviedDigits,digitNow)
answer += digitNow;
console.log('2',answer)
diviedDigits -= digitNow * (10 ** (i-1));
console.log('3',diviedDigits,'\n')
}
return answer;
}
다른 사람의 풀이 1.
function solution(n){
// 문자 풀이
// return (n+"").split("").reduce((acc, curr) => acc + parseInt(curr), 0)
// 숫자풀이
var sum = 0;
do {
sum += n%10;
n = Math.floor(n/10);
} while(n > 0);
return sum;
}
내가 생각한것과 가장 비슷하면서도 더 깔끔한 풀이
다른 사람의 풀이 2.
function solution(n)
{
var a = (n + '').split('');
var b = 0;
for(var i = 0; i < a.length; ++i) {
b += parseInt(a[i]);
}
return b;
//return n.toString().split('').reduce((a, b) => (a * 1) + (b * 1));
}
숫자를 배열로 만들어서 간단하게 풀어냈다.
문제 조건에서는 상관 없지만, 소숫점, 16진법 등의 문제로 오류가 터질 수 도 있으니 이런류의 알고르즘은 조심해야겠다.
버그가 터졌을 때 그게 논리적인 버그인지 아니면 기술적인 버그인지 잘 생각해야할 것같다.
업소를 가진 사람이 이미 등록된 업소가 있어서 탈퇴가 안되는 것은 버그라고 할 수 있다.
하지만 정말로 버그일까? 기술적으로는 단순히 CASCADE 로 연동된 테이블의 레코드를 삭제해버리면 되지만, 서비스적으로는 그렇게되면 사기를 친 사람이 잠적하기 최적화된 엉터리 플랫폼이 되고 말것이다.
쿠키와 세션에 대해서 잘못알고 있던것들을 고쳤다.
프로그래머스에서 문제 풀 때 나랑 같은 생각을 한 사람들이 있는건 좋지만, 더 잘 구현한 사람은 항상 있다 꾸준히 해야겠다.
컴퓨터는 소숫점을 제대로 기억하지 못하기 때문에 소숫점을 남기는 방식이 아니라 없애는 방식으로 구현을 해야겠다.
https://mozilla.github.io/nunjucks/
[Node.js ] template engine 사용하기 (Nunjucks)
[Nunjucks] 📚 넌적스 기본 문법 💯 총정리
쿠키(Cookie), 세션(Session) 특징 및 차이
쿠키(Cookie) 그리고 세션(Session)
네이버사전 : Confidentiality
네이버사전 : Integrity
네이버사전 : Authenticity
Authenticity vs Integrity