내일배움캠프 오늘 학습 내용
- node 숙련주차 개인 과제 : 로그인 인증 구현, user와 product의 join
로그인 성공 시 토큰을 헤더로 옮기기
어제 로그인에 성공하면 성공적으로 jwt 토큰을 발행하였지만, 다른 곳에서는 확인할 수 없었다. 오늘 원인을 찾았는데, 우리가 인증을 하기 위해서 header의 authorization를 보고 로그인이 되어 있는지 아닌지를 확인하여야 하지만, 내가 토큰을 넣는 것은 쿠키에만 넣고 헤더엔 넣지 않아 그렇게 된 것이었다. 전에 강의를 들을 때 받은 프론트엔드 asserts 파일을 찬찬히 읽어본 결과 해당 프로젝트에서는 localstorage를 사용하여 토큰을 저장하고 가져와 header의 authorization에 넣어주는 것을 확인하였다. 그렇지만 나는 localstorage를 쓰지 않고 req.headers.authorization에 Bearer와 cookies.token을 바로 넣어주었다. 하지만 이렇게 넣어주는 경우 매번 새롭게 불러올 때마다 cookie값을 header에 붙여줘야하기 때문에 배운 것을 써볼 겸 또다른 middleware를 만들어 모든 라우터를 쓰기 전에 실행하도록 하였다.
//header authorization
app.use((req, res, next) => {
if (req.cookies.token) {
req.headers.authorization = `Bearer ${req.cookies.token}`;
}
next();
});
또, cookie를 만들 때 해당하는 domain에만 cookie를 저장하는 문제가 생겨 path를 지정해주었다. path 이하의 모든 도메인에서 cookie를 사용할 수 있다. (최상위로 설정해두었으니 모두 다)
res.cookie("token", token, {
expires: expires,
path: "/",
});
User와 Product의 Join
과제를 시작하기 전 product 테이블에 userId를 저장하는데 왜 굳이 join을 하라고 하였을까 궁금하였는데 오늘 실제로 구현해보면서 답을 알았다. 과제의 요구사항은 userId를 출력하는 것이 아닌 User에 저장된 name을 출력해야하기 때문에(!!!) 해당 userId에 해당하는 name을 찾기 위해 Join이 필요한 것이었다. sequelize에서 join에 해당하는 것은 include다. 이것을 이용해 User의 값을 가져와서 같이 출력하면 되지만 여기서 많은 문제가 생겼다. Product에서 userId를 참조하는 column값이 author로 지정해두었다는 점 때문에 해당 값을 찾지 못하고 계속 오류가 나타났다. 그냥 테이블을 고쳐 author말고 userId를 사용해 편하게 join을 한다면 좋았겠지만, 기왕이면 에러를 고쳐보고 싶어 도전하였고, 성공하였다. 그리고 그 에러를 해결하는 와중에서 알아낸 점도 몇 가지 있다.
우선 model에서 지정한 모델 이름이 User와 Product인데 migration에서는 Users와 Products로 지정되어있는 점을 확인하였다. 이것은 sequilize가 그렇게 기본적으로 만드는 듯하다. DB에 저장할 때 table 이름은 migration 파일의 createTable 함수에 적혀있는 이름을 따라 가는 듯 했다. 모델에 User는 User로, Product는 원래 Products로 적어두었는데 통일을 주기 위해 다시 Product로 바꾸어 새로 만들었다. 그렇게 model에서는 User와, migration 안에서는 Users와 reference를 각각 연결해주었다. 또, reference를 설정한 것으로 될 줄 알았는데, model에서 기본적으로 만들어주지만 처음엔 비어 있는 associate 함수에도 다시 명시를 해주어야 제대로 연결이 되는 것을 확인할 수 있었다. 여기서는 내가 foreignKey로 사용하는 author를 입력해주어야 했다.



나는 처음에 model generate 때 author 없이 테이블을 만들고 나중에 author column과 외래키 속성을 추가하였기에 여러 가지 공부해가며 추가해볼 수 있었다. join에 성공하였고 결과는 이렇다.




현재는 app.use("/api", authMiddleware, [productFouter]); 로 사용 중이기 때문에 /api에 있는 모든 기능이 로그인이 필요하지만 과제의 요구사항에서 제품 조회는 인증이 없어도 가능한 것 같아 나중엔 여기서 하지 않고 각각 필요한 router에서만 미들웨어를 추가해줄 예정이다. 내일은 put과 delete에서 작성한 당사자만이 제품을 수정하고 삭제할 수 있도록 추가할 예정이다.
'javascript+node.js' 카테고리의 다른 글
| 11/17 노드 숙련 수업 9 (AWS 서버 배포) (1) | 2023.11.17 |
|---|---|
| 11/16 노드 숙련 수업 8 (0) | 2023.11.16 |
| 11/14 노드 숙련 수업 6 (0) | 2023.11.14 |
| 11/13 node 숙련 수업 5 (0) | 2023.11.13 |
| 11/10 노드 숙련 수업 4 (0) | 2023.11.10 |
댓글