일정시간 동안 동일한 사용자에 대한 상태정보를 유지시키는 것 (사용자 정보 서버 상에서 관리)
- 서버와 클라이언트의 연결이 활성화된 상태
- 클라이언트 구분위해 각 client에 대해 session id를 부여하여 서버 측에서 관리
- 사용자의 정보 중 보안상 중요한 data는 session 관리
사용자의 정보를 사용자 메모리(브라우저)에서 관리
- 서버가 사용자의 위치에 정보를 저장하고 불러올 수 있는 수단
- 이름, 값, 만료 날짜, 경로 정보 등으로 구성
- 특정 호스트에서 생성된 쿠키는 이 후 모든 요청마다 서버로 다시 전송
- client -- request POST/ LOGIN --> server
- server -- response POST/LOGIN
set-cookie; token: session_token
--> client- client -- request GET/ INFO
cookie; token: session_token
--> server- server -- response GET/ INFO
cookie; token: session_token
--> client
인증을 위해 사용되는 암호화 문자열
- http통신의 stateless 특징과 알맞음
- 유저의 인증 정보를 server, session에 저장하지 않음
- 유저의 활성화 여부와 상관없이, 넘겨진 요청에 담겨진 token의 정합성만 확인
- 서버가 클라이언트의 요청만으로 작업처리하여 상태관리 비용 x, 서버 확장에 용이함
( stateless: server side에 client와 server의 동작, 상태정보를 저장하지 않는 형태, server의 응답이 client와의 세션 상태와 독립적임
sateful: server side에 client와 server의 동작, 상태정보를 저장하는 형태, 세션 상태에 기반하여 server의 응답이 달라짐 )
암호화
- client ---
pw:'abcd'
---> server- server ---
pw: 'diofhsoagab'
(암호화) ---> server- DB ---
pw: 'diofhsoagab'
---> server
어떠한 문자열에 '임의의 연산'을 적용하여 다른 문자열로 변환하는 것
- 오래걸리지 않아야 함
- 고유한 해시 값 가져야 함
- 원본과 완전히 다른 값을 가져야 함
해시 하려는 값(원본)에 추가하는 값
- 알고리즘을 통한 원본 역추적 방지
- ( 암호화 하려는 값 ) + ( salt 값 ) => ( hash 값 )
node.js 내장 암호화 모듈 [공식문서]
사용법
const crpto = require ('crypto'); const secret = 'abcdefg'; const hash = crypto.createHmac ('sha256', secret) .update ('I love cupcakes') .digest ('hex');
'sha256'
: 알고리즘 방식secret
: salt'I love cupcakes'
: hashing 할 값'hex'
: 인코딩 방식
값 + salt => 알고리즘으로 값 변환 => 변환 값을 입력 받은 방식으로 인코딩 => hash 값
(암호화는 http stateless 특성을 가지지만, 이 스프린트는 stateful로 진행)
http.createServer((request, response) => {
...
response.writeHead(200, {
'set-cookie': `session_id=${token}`,
})
...
let SESSIONS = [];
...
let credential = querystring.parse(body);
let token = SHA256(credential.username).toString();
SESSIONS.push(token);
response.writeHead(200, {
'set-cookie': `session_id=${token}`,
})
로 넣어주었던 것을
let cookieObj = querystring.parse(request.headers.cookie, '; ');
let testToken = cookieObj.session_id;
console.log(`${SESSIONS.includes(testToken) ? "true" : "false"}`)
로 확인해 보았다.