세션과 쿠키라는 단어는 많이 들어보았으나 물어본다면 대답을 할 수 없었습니다. 이에 대해 정리해보려고합니다.
connectionless
: HTTP는 클라이언트가 요청한 후 응답을 받으면 그 연결을 끊어버리는 특징이 있습니다.
연결을 끊는 순간 클라이언트-서버간 통신이 끝나고, 상태정보는 유지하지 않는 특성이 있습니다. 이를 stateless
라 합니다.
쿠키와 세션은 이 두가지를 해결하기위해 사용합니다.
이름 : 쿠키를 구별하는데 사용하는 이름
값 : 쿠키의 이름과 관련된 값
유효시간 :쿠키의 유지시간
도메인 : 쿠키를 전송할 도메인
경로 : 쿠키를 전송할 요청 경로
세션은 서버 메모리를 많이 차지할 수 있기 때문에 이런 문제를 보완한 토큰기반인증방식, JWT(Json Web Token)을 많이 사용하는 추세.
Json포맷을 이용해 사용자에 대한 속성을 저장하는 WebToken.
사용자 정보를 JSON객체에 담아 암호화하고 해싱 작업을 거쳐서 문자열 토큰을 생성하는 기술.
클라이언트는 이 토큰을 HTTP Header에 추가하여 요청을 보냄으로써 사용자 인증을 얻게된다.
서버에 저장되지 않아 부하를 일으키지 않고 해싱을 통해 데이터무결성을 보장한다. (해싱 : 원문을 일정 길이의 byte로 변환)
토큰에 사용자 정보와 권한을 명시하는 것이다.
JWT는 Header, Payload, Signature로 구성되어있다.
적절한 속성, 값을 명시하면 자동으로 라이브러리에서 인코딩, 해싱작업을 진행해줍니다.
typ, alg속성을 명시
토큰에 대한 정보를 작성
정보는 속성 + 값으로 표현되며, 이를 claim이라 한다.
클레임은 3가지로 작성할 수 있는데 registerd, public, private가 있다.
헤더, 내용의 인코딩 값을 '.'으로 연결하여 합친 후 비밀키로 해싱. => 암호화작업
각 값을 합치면 JWT가 생성된다.
JWT는 HTTP Only옵션의 쿠키에 저장하는 것이 좋다.
쿠키에 저장하기 위해서는 cookie-parser라이브러리를 설치해서 사용할 수 있다.
JWT를 이용해서 토큰발행하기
jwt에서 웹토큰을 생성하기 위해선 sign()메소드를 이용한다.
생성될 토큰에 유저의 정보나 암호화를 위한 키 지정, 만료시간 등을담는 역할을 한다.
let token = jwt.sign({
email : `${login_email}`
},
secretObj.secret, // 비밀키
{
expiresIn: '5m' // 유효시간
})
쿠키에 유저정보가 저장된 토큰이 있다면, admin페이지에 요청할 때 해당 토큰의 계정명이 admin과 같은지 비교해야한다.
따라서 인코딩된 email의 값을 디코딩하여 root 또는 admin과 같은지 비교해야할 것이다.
토큰이 헤더에 어디에 담기는지부터 알아보아야겠다.
해당 페이지 헤더의 Cokkie에 잘 들어가있는 것을 확인했다.
그렇다면 이 쿠키의 내용을 다른 라우터에서도 유지되고, 가져올 수 있는지를 확인해야한다. => 다른 페이지에서도 잘 유지된다.
다른페이지에서 저장된 쿠키의 값을 가져오는 방법
=> route의 requset메소드인 cookies를 통해 가져올 수 있음.
let token = req.cookies['쿠키이름'];
이렇게 얻어진 인코딩된 토큰 내용을 다시 디코딩하여 원하는 계정명인지 확인해야하는 작업이 필요하다.
decode는 jwt의 메소드인 verity
를 이용하면된다.
let decoded = jwt.verify(token, 비밀키);
이렇게하면 decoded는 인코딩하기전의 메일 내용으로 디코딩된다!
뜬금없지만.. 코드를 다시 보다가 정리가 잘된 글을 보고 작성..
app.use
에 함수를 넣은 것을 middleware라고하고, route에 상관없이 request가 올 때마다 수행되는 내용이다.
위에서 순차적으로 실행되기 때문에 순서가 중요하다.
app.use
에 들어가는 함수는 route의 함수와 동일하게 req, res, next
3개의 인수가 들어가고 함수 안에는 반드시 next()가 들어가야한다. 들어가지 않으면 다음 app.use함수를 실행시키지 못하고 그 안에서 계속 대기하게 된다.