ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL_200618
    Today I Learned 2020. 6. 18. 12:55

     

     

    세션은 서버와 클라이언트의 연결이 활성화된 상태 자체를 의미합니다.

    세션 객체는 서버에 저장되어 관리됩니다.

    클라이언트에 개별적으로 발급되는 세션 id는 헤더의 set-cookie 속성에 담깁니다.

    만약에 세션을 서버에 저장하지 않고 쿠키만을 사용한다면 다른 사람이 마음대로 쿠키 값을 가져가서 로그인을 할 수 있습니다.

     

    다른사람이 세션ID를 가져가면 해당 유저로 접속할 수 있습니다. 그렇기 때문에 보안성을 높이기 위해 여러방법을 사용합니다.

    쿠키에는 유효기간이 있어서 일정시간이 지나면 사라지기 때문에 접속할 수 있는 기간이 정해져 있습니다. 또한 서버에도 유효기간을 정하여 유저가 일정시간동안 접속하지 않으면 삭제되도록 만들 수 있습니다. 

    보안성을 높이는 방법은 검증하는 요소를 정하는 것입니다. 예를 들어 쿠키를 대조하는 것과 동시에 클라이언트의 IP를 확인하여 보안성을 높입니다.

     

    해시(Hash)

    문자열이 해시함수를 거치면 알아볼 수 없는 문자열로 출력됩니다. 

    출력되는 값은 다시 원래 문자열로 되돌릴 수 없습니다. 

    레인보우테이블(Raindow Table)

    해시함수를 거친 값과 원래의 문자열을 모두 저장하여 해싱된 값을 보고 원래 문자열을 추측할 수 있게 됩니다.

    레인보우테이블로 인해서 비밀번호를 알 수 있습니다.

    그렇기 때문에 작은 조치를 통해 보안성을 높일 수 있습니다.

    솔트(salt)

    해시함수에 들어가는  문자열에 임의의 문자열을 더하여 보안성을 높입니다.

    그러나 솔트도 임의의 문자열을 추측할 수 있기 때문에 해싱된 값을 다시 해싱하기도 합니다.

    Key Derivation Functions - salt와 hash를 여러번하여 복잡도를 늘리는 방법 (bcrypt)

     

    케르크호프스의 원리

    키를 제외한 시스템의 다른 모든 내용이 알려지더라도 암호체계는 안전해야 한다.

     

     

     

     

    express session

    install

    $ npm install express-session 

    API

    let session = require('express-session')

    주어진 옵션으로 세션 미들웨어가 생성됩니다.

    세션 데이터는 쿠키에 저장되지 않습니다. 세션ID 만 저장되죠. 
    세션 데이터는 서버 측에 저장됩니다.

    세션 ID 쿠키의 설정 개체 기본값

    { path: '/', httpOnly: true, secure: false, maxAge: null }

     

    설정할 수 있는 옵션
    cookie.expires

    기본적으로 만료가 설정되지 않으며 클라이언트는 이 쿠키를 '비영구 쿠키'로 간주하여 브라우저의 종료와 같이 쿠키가 삭제됩니다.

     

    cookie.secure

    기본적으로 설정되어 있지 않으며 boolean 값으로 지정됩니다. 값이 true이라면 HTTPS 연결이 없는 경우에 클라이언트가 쿠키를 서버로 다시 보내지 않기 때문에 주의해야 합니다. secure: true로 사용하는 경우에는 'trust proxy'를 명시적으로 설정해야 합니다.

    const app = express()
    app.set('trust proxy', 1)
    app.use(session({
      secret: 'cat',
      resave: false,
      saveUninitialized: true,
      cookie: { secure: true }
    }))
    const app = express()
    const sess = {
      secret: 'cat',
      cookie: {}
    }
    
    if (app.get('env') === 'production') {
      app.set('trust proxy', 1)
      sess.cookie.secure = true
    }
    
    app.use(session(sess))

     

    resave

    요청 중에 세션이 수정되지 않는 경우에도 세션이 세션 저장소에 다시 저장되도록 합니다.

     

    saveUninitialized

    초기화되지 않은 세션이 저장소에 저장되도록 합니다. 세션은 새로 작성되었지만 수정되지 않은 경우 초기화되지 않습니다. false를 선택하는 경우는 로그인 세션을 구현하거나 서버의 저장공간을 효율적으로 사용하거나 쿠키를 설정하기 전에 권한이 필요한 규정을 쿠키에 설정할때입니다.

     

    secret 필수항목

    세션 ID 쿠키의 서명에 사용됩니다. 문자열 또는 여러 문자열의 배열을 사용할 수 있습니다. 배열을 사용하는 경우에는 첫번째 요소가 사용되고, 요청의 서명을 검증할 때 모든 요소를 확인합니다.

     

    req.session

    세션 데이터를 다루고자 할때 사용되며 JSON형태로 저장되어 있습니다. 

    // 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(callback)

    세션을 재생성할때 메서드를 호출하면 됩니다. 

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

     

    req.session.id

    각각의 세션은 고유한 ID가 있습니다. 이 값은 req.sessionID의 별칭이며 수정할 수 없습니다. 

     

    req.session.cookie

    각각의 세션은 고유한 쿠키 객체를 가지고 있습니다. 이를 통해서 방문자의 세션 쿠키를 변경할 수 있습니다. 

     

     

     

     

     

    'Today I Learned' 카테고리의 다른 글

    TIL_200622  (0) 2020.06.22
    TIL_200619  (0) 2020.06.20
    TIL_200617  (0) 2020.06.18
    TIL_200615 (Sequelize)  (0) 2020.06.15
    TIL_200611  (0) 2020.06.12

    댓글

Designed by CHANUL