청소 플랫폼 만들기 (21)
트러블 슈팅공부하며 느낀 점
참조한 페이지
어제 지적을 받은 이후에 app.js에서 클라가 보낸 jwt를 받은 후, permission을 분리한 뒤, 넌적스 문법을 사용하여 로그인 유무를 결정하는(?) 로직을 만들었다.
하지만 넌적스 문법의 특성상 {{변수명}}
을 body에 삽입해야하는 문제가 있었다.
위는 그 예시이다. 내 코드가 다 그렇지만 특히나 모범적이지는 않아서 코드블록으로 공유하지는 않는다.
이렇게한 뒤 .js
에서 읽어서 css를 조절하는 함수에서 사용할 수 도 있었지만, 문제는 개발자 도구등으로 쉽게 값을 볼 수 있다는 문제가 있다.
또 다른 문제가 있는데, 그것은 넌적스를 사용하지 않는 경우에는 적용이 불가능하다는 것이다.
.html
에 값을 넘기지 않고 바로 .js
파일로 바로 값을 넘기는 방법이 필요했다.
app.use(isLogin);
app.get('/', (req, res) => {
res.render('user.html', {});
});
app.get('/data', (req, res) => {
res.json({ look: res.locals.look });
});
없는 짱구를 굴려서 나온 방법이 바로 별도의 미들웨어를 사용한 뒤, 특정 경로로 값을 보내는 것이다. jwt를 검증하고 permission 값을 가져오는 일은 isLogin 이라는 별도의 미들웨어에서 처리하고, 그 값을 /data
라는 경로로 보내는 것이다.
그 후 js 파일에서는 아래와 같은 방식으로 가져왔다.
function isLogin() {
fetch('/data')
.then((response) => response.json())
.then((data) => {
var lookValue = data.look;
})
}
이후 이 값을 바탕으로 로그인 된 계정에 따라서 보여줄 버튼을 css로 가려냈다.
이제 로그인 기능은 대충 완성 되었으니 리프레시 토큰을 추가할 차례다. 일부러 토큰 유효기간을 짧게 해보자.
토큰이 만료 된 경우 위와 같은 페이지가 뜬다.
리프레시 토큰이 있다면 엑세스 토큰이 만료되어도 새로운 엑세스 토큰을 발급 받았을 것이다.
리프레시 토큰에는 페이로드가 없으므로, 엑세스 토큰에서 페이로드만 제거해서 만들어보자.
// 엑세스 토큰생성
let acessToken = jwt.sign(
{
email: isExistUser.email,
userId: isExistUser.userId,
permission: isExistUser.permission,
},
process.env.COOKIE_SECRET,
{
expiresIn: process.env.JWT_EXPIRE_TIME,
}
);
// 아래와 같이 페이로드를 싹다 날려버리면 안된다.
// 리프래시 토큰생성
let RefreshToken = jwt.sign(process.env.COOKIE_SECRET, {
algorithm: 'HS256',
expiresIn: process.env.JWT_EXPIRE_TIME2,
});
페이로드가 들어갈 칸{},
은 남겨놔야하는데 그 칸 마저 날려서 오류가 발생했다.
// 리프래시 토큰생성
let RefreshToken = jwt.sign({}, process.env.COOKIE_SECRET, {
algorithm: 'HS256',
expiresIn: process.env.JWT_EXPIRE_TIME2,
});
함수를 사용할때는 항상 형식에 유의하자
이제 리프레시 토큰을 만들었으니 쿠키에 넣을 차례다.
res.cookie('Authorization', token.acessToken, { httpOnly: true });
res.cookie('refresh', token.RefreshToken, { httpOnly: true });
잘 들어간다.
이제 로그아웃 할 때 지워보자.
res.clearCookie('Authorization', 'SignIn', 'refresh');
안된다...
res.clearCookie('Authorization');
res.clearCookie('SignIn');
res.clearCookie('refresh');
나름 간결하게 만든다고 하나에 다 때려박았는데 분명 두개까지는 잘됐는데 왜 세개부터는...
근데 좀더 검색해보니 두개도 제대로 안되는게 맞는것같다.
아무튼 이런 알고보면 별거 아닌 뻘짓으로 시간을 다 날려먹었다.
CS 지식은 트러블 슈팅에서 가장 중요한 기본기이다.
오류의 인지
문제 발생의 파악
문제를 재현해보기
버그를 재현할 수 있다면 해결한것과 다름 없다.
문제의 영역을 명확하게 한정해보기
문제가 잘 정의 됐다면 그것을 바탕으로 작업을 하자.
정보를 찾아보기
머릿속에 잘 그려지지 안흔다면, 코드의 흐름을 종이에 적어서 흐름을 파악하자. 변수의 상태를 춪거하며 버그의 원인을 발견하는 것이다.
문제 해결/실패
해결에 성공했든 실패했든간에 최대한 정리해서 팀원들과의 회의에서 이야기하자.
개선 역시 버그 수정과 마찬가지로 어떻게 처리했는지에 대한 과정을 남겨야한다.
시스템 아키텍쳐에 대해 고민을 해야한다.
동시성 처리 알고리즘
성능이 느린 쿼리는 관계 및 인덱스 확인
자주 불리는 API는 response 캐싱
신고시스템
오류나 이상 징후가 있을 시 시스템으로 알림을 받을 수 있어야한다.
Logger & Alram(by metric)
언제나 실수를 할 수 있기 때문에, 로컬 환경에서 고치더라도 항상 코드 커밋을 하고 트러블 슈팅이나 핫픽스를 하자.
DB 성능 이슈시 N+1 에러가 있는지 확인하자
챗 GPT는 항상 최신이 아니다.
모르는걸 모른다고 안하고 개소리로 포장하니 잘 거르자
GPT의 장점은 양산이다
구글링을 할 때는 아티클 위주로 보자
이미 유튜브 같은데 올라왔다면 씹뜯맛이 끝난건다
공학영어에 대해 잘알아야한다.
처음부터 번역기를 쓰지말자