Dev/SW Engineering

37. Authentication - Session

HJChung 2020. 9. 6. 13:01

+ Authentication에 대해 공부한 것을 정리한 것입니다. 배우는 중이라 잘못된  내용이 있을 수 있으며 계속해서 보완해 나갈 것입니다. :))

 

 

libertegrace.tistory.com/entry/33-Authentication-Cookie?category=869766

 

33. Authentication - Cookie

인증(Authentication)을 할 때는 보통 (로그인을 통해) user를 판별한다. 이때 Session, Cookie가 필요하다고 했는데 왜 필요한 것일까? 로그인 한 후 새로고침(새로운 요청)을 할 때마다 초기화된다면? 그��

libertegrace.tistory.com

앞서서 "서버는 브라우저에게 응답(response)의 header에 set-cookie를 통해 '키=값(ex name='Hyeonjeong') 형태의 쿠키를 심고, 브라우저는 쿠키를 저장해서, 그 이후의 요청부터는 쿠키가 클라이언트와 서버 의 요청과 응답 과정에 왔다갔다 한다." 고 정리했다. 

 

그런데 그 쿠키를 보면(크롬 개발자 도구의 Application탭에서, Cookies에 들어가보면) 내 쿠키의 값(value)가 그대로 노출이 되어있고, 

심지어 (아래 사진과 같이) 그 자리에서 바로 수정도 되며 x 를 누르면 삭제 되기도 한다. 

 이렇게 쿠키에는 이름, 어떤 개인 식별 정보 등 민감한 정보를 넣어두는 것은 매우 부적절하다. 

 

그래서 중요한 정보는 서버에서 관리하고, 클라이언트에는 이 중요한 정보를 얻을 수 있는 session키 을 주는 방법으로

브라우저 표면 상으로는 중요한 정보가 드러나지 않게 하는 방법이 session'방법'이다.

 

1. Session란

시간적 개념으로는 서버와 클라이언트의 연결이 활성화 된 상태를 말한다.

이걸 Authentication을 공부하는 상황에 맞게 이해해보자면, 

서버와 클라이언트의 연결이 활성화 되어 있을 때! 서버가 클라이언트에 대해 유일한 sessionID(유일한ID)를 부여하여 중요한 정보는 서버측에서 관리하도록 한다. 그래서 일반적으로 이 유일한 sessionID가 서버에 존재하는 상황을 Session이라고 볼 수도 있다.

가 내가 이해한 바이다. 

 

2. Session의 사용

  1.  로그인에 성공 할 경우, 중요한 정보는 서버에서 관리하고 클라이언트에는 sessionID만 제공하고자 한다.  서버에 주요 정보 저장을 위한 객체 즉 서버에 생성되는 세션 객체(SESSION)을 생성 후, 
  2. sessionID(유일한 ID; token)을 만들어서 
  3. sessionID을 속성명으로 하고 주요 정보를 속성값으로 하여 세션 객체(SESSION)에 저장한다. 
  4. 그리고 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

hahahoho5915.tistory.com/32

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