상세 컨텐츠

본문 제목

세션 기반 인증 - Session-based Authentication

Computer Science/Security

by Yongari 2023. 1. 3. 15:03

본문

 

세션기반 인증에 대해 알아봅시다.

 

로그인과 인증성공 정보 > 세션

 

사용자가 아이디와 비밀번호를 정확히 입력하면 서버는 인증에 성공했다는 정보를 알고있습니다. 그렇다면 인증에 성공한 정보를 서버가 알고있기때문에 어떤 행위를 할때마다 로그인할 필요는 없어집니다. 

이 때 서버와 클라이언트에 각각 필요한것은 다음과 같습니다.

 

  1. 서버는 사용자가 인증에 성공했음을 알고 있어야합니다.
  2. 클라이언트는 인증 성공을 증명할 수단을 갖고있어야합니다.

 

여기서 인증성공에 관련된 현업에서 자주 쓰는 용어가 나옵니다.

 

  • 사용자가 인증에 성공한 상태를 "세션"이라고 합니다. 서버는 일종의 저장소에 세션을 저장합니다. 주로 in-memory(자바스크립트 객체를 생각하면됨), 또는 세션스토어(redis 같은 트랜잭션이 빠른 DB)에 저장합니다. 
  • 세션이 만들어지면, 각 세션을 구분할 수 있는 세션아이디도 만들어지는데 보통 클라이언트에 세션 성공을 증명할 수단으로서 세션 아이디를 전달합니다. 

그리고 웹사이트에서 로그인을 유지하기 위한 수단으로 쿠키를 사용합니다. 쿠키에는 서버에서 발급한 세션 아이디를 저장합니다.

로그아웃

 

그렇다면 로그아웃은 어떻게 구현해야 하나요?
세션 아이디가 담긴 쿠키는 클라이언트에 저장되어 있으며, 서버는 세션을 저장하고 있습니다. 서버는 그저 세션 아이디로만 요청을 판단합니다. 

 

보안 주의! 쿠키는 세션아이디, 인증성공에 대한 증명을 갖고 있으므로, 탈취될 경우 서버는 해당요청이 인증된 사용자의 요청이라고 판단합니다. 이런 이유때문에 우리는 공공PC나 많은 사람들이 쓰는 PC에서 사용 후 로그아웃해야하는 이유입니다.

 

로그아웃은 다음 2가지를 구현해야합니다.

  • 서버의 세션 정보를 삭제해야합니다. 
  • 클라이언트의 쿠키를 갱신해야합니다. 

 

Express-session

 

이런 세션을 대신 관리해주는 'express-session'이라는 모듈이 있습니다. 이 모듈은 세션을 위한 미들웨어로 "Express"에서 세션을 다룰 수 있는 공간을 보다 쉽게 만들어줍니다. 그리고 필요한 경우 세션 아이디를 쿠키에 저장하고 해당 세션 아이디에 종속되는 고유한 session 객체를 서버 메모리에 저장합니다. 이 때 session 객체는 서로 독립적인 객체이므로 각각 다른 데이터를 저장할 수 있습니다. req.session이 바로 session 객체이며 session data를 저장하고 불러오기 위해 사용합니다.

 

 

req.session

 

세션 데이터를 저장하거나 액세스하려면 저장소에서 req.session(일반적으로) JSON으로 직렬화되는 request 속성을 사용하기만 하면 됩니다. 따라서 일반적으로 중첩된 개체가 좋습니다. 예를 들어 다음은 사용자별 뷰 카운터입니다.

 

 

// Use the session middleware
// 세션 미들웨어 사용하기 
app.use(session({ secret: 'keyboard cat', cookie: { maxAge: 60000 }}))

// Access the session as req.session
app.get('/', function(req, res, next) {
  if (req.session.views) {
    req.session.views++
    res.setHeader('Content-Type', 'text/html')
    res.write('<p>views: ' + req.session.views + '</p>')
    res.write('<p>expires in: ' + (req.session.cookie.maxAge / 1000) + 's</p>')
    res.end()
  } else {
    req.session.views = 1
    res.end('welcome to the session demo. refresh!')
  }
})


// Session.regenerate 세션 재생성
// 세션을 재생성하려면 메서드를 호출하기만 하면 됩니다. 완료되면 
// 새 SID와 Session인스턴스가 초기화되고 req.session 가 callback호출됩니다.

req.session.regenerate(function(err) {
  // will have a new session here
})


// Session.destroy(콜백)
// 세션을 파괴하고 req.session속성을 설정 해제합니다. 완료되면 callback가 호출됩니다.

req.session.destroy(function(err) {
  // cannot access session here
})


//Session.reload(콜백)
// 저장소에서 세션 데이터를 다시 로드하고 req.session개체를 다시 채웁니다. 
// 완료되면 callback가 호출됩니다.
req.session.reload(function(err) {
  // session updated
})


// session.save(콜백)
// 저장소에 있는 내용을 메모리에 있는 내용으로 대체하여 세션을 다시 저장소에 저장합니다(저장소가 다른 작업을 수행할 수 있지만 정확한 동작에 대해서는 저장소 문서를 참조하십시오).
// 이 메서드는 세션 데이터가 변경된 경우 HTTP 응답이 끝날 때 자동으로 호출됩니다(이 동작은 미들웨어 생성자의 다양한 옵션으로 변경할 수 있음). 이 때문에 일반적으로 이 메서드를 호출할 필요가 없습니다.
// 예를 들어 리디렉션, 오래 지속되는 요청 또는 WebSocket에서 이 메서드를 호출하는 것이 유용한 경우가 있습니다.
req.session.save(function(err) {
  // session saved
})



req.session.cookie
// 각 세션에는 고유한 쿠키 개체가 수반됩니다. 이를 통해 방문자별로 세션 쿠키를 변경할 수 있습니다. 
// 예를 들어 쿠키가 사용자 에이전트 기간 동안만 유지되도록 설정할 req.session.cookie.expires수 있습니다.false
// Cookie.maxAge
// 또는 req.session.cookie.maxAge남은 시간을 밀리초 단위로 반환하며 
// .expires속성을 적절하게 조정하기 위해 새 값을 다시 할당할 수도 있습니다. 다음은 본질적으로 동일합니다.

var hour = 3600000
req.session.cookie.expires = new Date(Date.now() + hour)
req.session.cookie.maxAge = hour


Cookie.originalMaxAge
req.session.cookie.originalMaxAge속성은 세션 쿠키의 원본(수명)을 밀리초 단위로 반환 합니다 maxAge.

 

 

 

 

req.session에 대한 정보입니다. 

https://github.com/expressjs/session#reqsession 

 

GitHub - expressjs/session: Simple session middleware for Express

Simple session middleware for Express. Contribute to expressjs/session development by creating an account on GitHub.

github.com

 

 

출처 : 코드스테이츠 참조 

관련글 더보기