로그인된 회원들 정보 저장 조언 부탁드립니다!!!

안녕하세요 로그인 관련해서 하나 궁금한게 있습니다.
자바스크립트와 node.js를 사용중입니다.

홈페이지 로그인창에서 로그인을 한후 서버에서 db값을 확인후 서버 세션에 회원정보(id, nick, level…)를 저장 하고있습니다. 그리고 클라이언트쪽에서 글쓰기, 로그인 되어있는지 등 확인이 필요하여 ajax를 사용하여 세션에 저장된 회원정보를 가져옵니다. 여러분들은 이 데이터를 어떻게 저장을 하여 사용하나요? 변수, 쿠키에 넣자니 개발자도구에서 쉽게 변경이 가능하고… 방법이 있을까요?

소스

    app.post('/login', function(req, res) {
      var check = req.body.check;
      var randnum = req.body.randomnum;
      var id = req.body.id;
      var pass = crypto.createHash('sha512').update(req.body.password).digest('base64');
      var ip = requestIp.getClientIp(req);
      var ipcut = ip.indexOf('::ffff:');
      var ipcu2 = ip.slice(ipcut + 7, ip.length);
      var sql = 'SELECT * FROM member WHERE id="' + id + '" AND password="' + pass + '"';
      var sql2 = 'UPDATE member SET ip_con = "' + ipcu2 + '" WHERE id = "' + id + '";';
      conn.query(sql, function(err, rows, fields) {
        if (rows.length >= 1) {
          var autologin = false;
          if (check === true) {
            autologin = crypto.createHash('sha512').update(req.body.id).digest('base64') + randnum;
            var sql5 = 'UPDATE member SET auto_login_t = "' + autologin + '" WHERE id = "' + id + '";';
            conn.query(sql5, function(err, rows, fields) {});
          }
          req.session.ucheck = true;
          req.session.uid = rows[0].id;
          req.session.unick = rows[0].nick;
          req.session.ulevel = rows[0].level;
          req.session.uban = rows[0].ban;
          res.json({
            result: true,
            enter: true,
            auto_login: autologin
          });
          conn.query(sql2, function(err, rows2, fields) {});
        } else {
          res.json({
            result: true,
            enter: false
          });
        }
      });
    });

위 방법으로 서버 세션에 저장하고

  res.json({
    result: true,
    enter: 'login',
    check: req.session.ucheck,
    id: req.session.uid,
    nick: req.session.unick,
    level: req.session.ulevel,
    ban: req.session.uban,
    darkmode: req.session.udarkmode
  });

ajax로 json형태로 데이터를 가져옵니다.

변수에다 집어넣었을 때
개발자 도구에서 바꿀 수 있다는게 잘 이해가 안되는데
어떤 방법으로 바꾸실 수 있나요??

제가 만든 방법이 틀린방법인거 같아서 질문드립니다. 회원정보를 서버에서 받아와 전역변수로 그 회원정보를 저장합니다. 글쓰기, 로그인페이지 등… 모든 페이지에서 회원정보가 필요하여 전역변수로 사용합니다. 그런데 이 사용방법이 전역변수안에 로그인한사람이라면 예시로

let user = {
enter: true,
id: '아이디'
...
}

이런 방법으로 변수에 저장하여 글쓰기라면 조건문으로 enter가 true인지 검사한후 맞다면 저장되어있는 id, nick…을 ajax방식으로 서버에 전달하여 글쓰기를 완료합니다. 여기서 개발자도구에서 user.id = '다른 아이디’로 변경을 해버리면 서버에 바뀐 아이디가 전달됩니다. 이문제때문에 질문드렸습니다. 혹시 다른방법으로 유저정보를 저장시키는 방법이 있는지요…

로그인을 성공하면 아이디를 pass해주는게 아니라
token을 던져주고
enter라는 값이 true인지 확인이 필요하면
backend API를 token을 인자로 호출을 하게되겠죠
이 방식을 쓰면 다른 사람의 ID를 알아도 다른 사람의 token값을 알 방법이 없기 때문에 원하시는 문제가 해결될거 같네요

토큰 사용방법이 궁금하시면 구글에 “JWT 로그인” or “jwt token” 으로 검색하면 정보를 얻으실 수 있을겁니다

1개의 좋아요

아 토큰값을 주는 방법이 있었네요… 너무 다르게 생각하고있었네요 도움주셔서 감사합니다!

  1. 우선 유저 정보 같은경우 Frontend 단의 특정 프레임워크를 써서 쉽게 접근 되게 하지 않는 이상 일반 변수에 지정하는 방법보단 sessionStorage에 저장하는 방식이 조금더 좋을꺼같네요.(그래도 변조는 가능합니다…)

  2. 위 쿼리에서 + id + 같은 것들을 쓰셨는데 위와같이 하게될경우 보안에 취약하게됩니다.
    데이터 베이스 Injection 공격부분을 찾아보시고 위와 같은 부분들은 escape 하여 ‘?’ 또는 ‘??’ 를 사용 하여 처리하시는 방법이 좋습니다.

  3. 위 로그인 처리부분을 보니 최대 3번 쿼리를 excuete 하는 것으로 보입니다만… 멀티쿼리를 적용하여 1회에 모든 쿼리를 날리고 끝내는 방법을 연구해보아도 좋아보입니다.

  4. 리퀘스트 세션에 유저 정보를 저장하실때 아래와 같이 한오브젝트에 저장하는 방법이 어떠실까요?
    req.session.user = {
    ucheck : true,
    uid : rows[0].id,
    unick : rows[0].nick,

    }

  5. 마지막으로 글쓰기 또는 수정 하실때의 유저정보는 이미 req 세션에 유저의 정보가 저장되어있습니다. 그정보를 활용하여 유저 정보를 쿼리에 파라미터로 사용하신다면 개발자도구에서 유저가 변조한다 하여도 서버세션의 정보를 활욜할 것이기 때문에 문제가 되지 않을것 같습니다.
    수정의 경우에도 권한이 없어 수정페이지 또는 수정버튼을 누를수 없어야되지만 사용자가 변조하여
    해당 api를 요청 하였다 하더라도, 세션에 저장된 유저정보로 비교하여 잘못된권한요청 으로 리턴하시면 될것 같습니다.

긴글 읽어 주셔 감사합니다.

답변 감사드립니다. 몇가지 질문을 드리고 싶은데,

1번 같은 경우는 로그인 할경우 서버 sessionStorage에 유저 정보를 저장하여 프론트쪽에 인증이 필요한 경우 서버 sessionStorage을 그때마다 ajax로 가져와 인증을 하고있습니다. 이러한 방법이 괜찮을까요? 인증이 필요할때마다 서버에 연결해서 가져온다면 서버에 무리가 안갈까 그런 고민이 있습니다.

1에서 언급한 sessionStorage는 서버단 session을 말한것이 아니라
html5의 웹스토리지 입니다. 브라우저의 자원을 활용하는 방식이며
sessionStorage, localStorage 부분을 활용하고 매번 ajax로 정보를 호출할 필요는 없을것 같습니다.

웹의 경우 어느정도 스크립트를 다룰줄 안다면 언제나 변조는 가능하므로 이중 삼중으로 처리를 해주어야 된다고 생각합니다.

  1. 유저의 접근권한으로 보안을 요하는 페이지는 리소스를 애초에 전달하지 않도록 처리하는것과
  2. 권한은 있으나 정상적이지 않은 요청을 막기위한 유효성체크(캡챠 등)
  3. 페이지 리소스 없이 프로세스만 호출한 경우를 방지하기 위해 backend 에서 다시한번 인증을 거쳐야 될것입니다.
    기타. 언급되지 않은 부분중 개발자 개인의 노하우 또는 상황에따라 추가 인증등

우리가 사용하는 웹 서버와 웹서비스는 생각보다 성능이 더 좋습니다.
진행중인 프로젝트의 예상 동시 사용 유저수가 얼마인지는 모르겠으나,
인증이 필요할때마다 매번 유저 정보를 호출한다 하여도 대부분 커버가 가능할 것입니다.

혹시 확인이 필요하실경우 backend 부분에 아무 일도하지않고 리턴해주는 라우터를 하나 만들어두고,
프론트단에서 초당 몇회, 다중 브라우저에서 몇회 등등 점차 늘려가면서 확인해보시기 바랍니다.
생각보다 지연없이 잃어버리는것 없이 잘 응답받고있음을 확인하실수 있을것입니다.

2번 escape의 경우 질문하셨다가 지우신걸로보아 정답을 알아내신것으로 생각하여 이만 줄이도록 하겠습니다.

감사합니다.

1번을 제외한 나머지 방법은 알려주신 방식을 토대로 구글에 검색을 해봐서 좋은 공부가 되었습니다. 너무 좋은 답변을 해주셔서 많은 도움이 되었습니다 감사합니다. 저도 앞으로 답변주신 분처럼 좋은 개발자가 되고싶네요 ㅎㅎ 알려주신 1번 방법도 많은 도움이 되었습니다.