+ Authentication에 대해 공부한 것을 정리한 것입니다. 배우는 중이라 잘못된 내용이 있을 수 있으며 계속해서 보완해 나갈 것입니다. :))
libertegrace.tistory.com/entry/33-Authentication-Cookie?category=869766
앞서서 "서버는 브라우저에게 응답(response)의 header에 set-cookie를 통해 '키=값(ex name='Hyeonjeong') 형태의 쿠키를 심고, 브라우저는 쿠키를 저장해서, 그 이후의 요청부터는 쿠키가 클라이언트와 서버 의 요청과 응답 과정에 왔다갔다 한다." 고 정리했다.
그런데 그 쿠키를 보면(크롬 개발자 도구의 Application탭에서, Cookies에 들어가보면) 내 쿠키의 값(value)가 그대로 노출이 되어있고,
심지어 (아래 사진과 같이) 그 자리에서 바로 수정도 되며 x 를 누르면 삭제 되기도 한다.
이렇게 쿠키에는 이름, 어떤 개인 식별 정보 등 민감한 정보를 넣어두는 것은 매우 부적절하다.
그래서 중요한 정보는 서버에서 관리하고, 클라이언트에는 이 중요한 정보를 얻을 수 있는 session키 을 주는 방법으로
브라우저 표면 상으로는 중요한 정보가 드러나지 않게 하는 방법이 session'방법'이다.
1. Session란
시간적 개념으로는 서버와 클라이언트의 연결이 활성화 된 상태를 말한다.
이걸 Authentication을 공부하는 상황에 맞게 이해해보자면,
서버와 클라이언트의 연결이 활성화 되어 있을 때! 서버가 클라이언트에 대해 유일한 sessionID(유일한ID)를 부여하여 중요한 정보는 서버측에서 관리하도록 한다. 그래서 일반적으로 이 유일한 sessionID가 서버에 존재하는 상황을 Session이라고 볼 수도 있다.
가 내가 이해한 바이다.
2. Session의 사용
- 로그인에 성공 할 경우, 중요한 정보는 서버에서 관리하고 클라이언트에는 sessionID만 제공하고자 한다. 서버에 주요 정보 저장을 위한 객체 즉 서버에 생성되는 세션 객체(SESSION)을 생성 후,
- sessionID(유일한 ID; token)을 만들어서
- sessionID을 속성명으로 하고 주요 정보를 속성값으로 하여 세션 객체(SESSION)에 저장한다.
- 그리고 sessionID(유일한 ID; token)을 클라이언트에 쿠키로 보낸다. (Set-Cookie 사용해야겠지?!)
그래서 코드와 함께 전체적인 것을 보면
이렇게 된다.
이를 그림으로 나타내보면
이렇게 이해할 수 있다.
쿠키만 사용했을 때와 비교해보면 더 이해가 잘 간다. ㅎㅎ
3. Session 사용(구현)
전체적인 코드는 cookie만 사용했을 때와 크게 다르진 않지만 위의 '2. Session의 사용'에서 해당 코드부분이 추가되는 것이다.
cookie만 사용했을 때와 session을 사용했을 때 변경된는 사항만 비교해서 본다면,
1)
cookie만 사용했을 때 cookie 생성)
http.createServer(async(req, res) => {
const cookies = parseCookies(req.headers.cookie); //1. req.headers.cookie 문자열을 받아와서 객체로 만들어주는 parseCookies 함수를 만들고 넣어준다.
if(req.url.startWith('./login')){
const{query} = url.parse(req.url);
const{name} = qs.parse(query);
res.writeHead(200, {
'Set-Cookie': `name=${encodeURIComponent(name)}`
});
res.end();
}
session을 사용했을 때 cookie 생성)
const SESSIONS = [] //데이터 저장을 위한 객체 즉 서버에 생성되는 세션 객체이다. 그리고 아래를 보면 token이라는 키를 만들어 속성명으로 사용한다.
//속성 값에 중요한 정보를 저장하고 token을 client에 보냄으로써
// 중요한 정보는 서버에서 관리하고 client에는 세션키(token)만 제공함으로써 노출되지 않고 조작될 위험도 적다.
http.createServer(async(req, res) => {
const cookies = parseCookies(req.headers.cookie);
if(req.url.startsWith('/login')){
const{query} = url.parse(req.url);
const{name} = qs.parse(query);
////////////////다른부분//////////////
const uniqueInt = Date.now(); //이게 다른사람과 겹칠일 없는 unique한 key를 만들고
session[uniqueInt] = { //sesssion에 이 uniqueInt key에 name과 expires를 저장하고 서버엔 uniqueInt를 보낸다.
name,
expires,
};
//////////////////////////////
res.writeHead(200, {
'Set-Cookie': `name=${encodeURIComponent(name)}`;
});
res.end();
}
2)
cookie만 사용했을 때 cookie 가 있는 경우 인증 상태를 확인)
else if(cookies.name){
res.writeHead(200, {'Content-Type':'text/plain; charset=utf-8'});
res.end(`${cookies.name}님 안녕하세요`);
}
session을 사용했을 때 cookie 가 있는 경우 인증 상태를 확인)
else if(cookies.session){
res.writeHead(200, {'Content-Type':'text/plain; charset=utf-8'});
res.end(`${session[cookies.session].name}님 안녕하세요`); //서버가 여기 접근해서 꺼내옴
}
reference
Node.js 교과서 - 조현영 지음
+ Authentication에 대해 공부한 것을 정리한 것입니다. 배우는 중이라 잘못된 내용이 있을 수 있으며 계속해서 보완해 나갈 것입니다. :))
'Dev > SW Engineering' 카테고리의 다른 글
40. Authentication - OAuth 2.0 (0) | 2020.09.14 |
---|---|
38. Authentication - Express cookie-parser (0) | 2020.09.13 |
36. Authentication - Cookie (0) | 2020.09.06 |
35. Authentication - Authentication & Authorization (0) | 2020.09.06 |
33. ORM - Sequelize (0) | 2020.09.05 |