Session
- 서버에서 관리하는 사용자 상태 정보
- 사용자가 로그인 시 서버가 세션을 생성하고, 특정한 세션 ID를 발급함
- 사용자가 요청을 보낼 때마다 세션 ID를 서버에 전달하면, 서버는 해당 사용자가 누구인지 알 수 있음
- 세션 정보는 서버 메모리, 데이터베이스, 혹은 파일 저장소에 저장됨
특징
- 서버에서 관리됨 : 클라이언트에는 세션 ID만 저장
- 보안성이 높음 : 사용자 정보가 클라이언트에 저장되지 않음
- 서버 메모리 사용 : 너무 많은 세션을 유지하면 서버에 부담이 될 수 있음
- 기본적으로 일정 시간 지나면 만료 : maxAge 설정 가능
Cookie
- 클라이언트에 저장되는 작은 데이터 조각
- 서버가 응답을 보낼 때 클라이언트에게 쿠키를 저장하라고 명령할 수 있음
- 클라이언트가 다시 요청할 때 쿠키 정보를 자동으로 서버에 전송함
- 로그인 상태 유지, 사용자 설정 저장 등에 사용됨
특징
- 클라이언트에 저장 : 서버에 부담이 가지 않는다.
- 보안성이 낮음 : 사용자가 쿠키를 조작할 수 있다
- 만료 기간 설정 가능 : 브라우저가 종료되어도 남아 있을 수 있음
- HTTP 요청 시 자동으로 서버로 전송됨
이를 이용해서 자동 로그인 기능을 만들어 보았다.
우선 , 세션과 쿠키를 저장하는 코드다.
app.use(session({
secret: process.env.SESSION_SECRET || 'session-login',
resave: false,
saveUninitialized: false,
store: new fileStore({
path: './sessions',
ttl: 24 * 60 * 60,
reapInterval: 60 * 60
}),
cookie: {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
maxAge: 24 * 60 * 60 * 1000
}
}))
세션은 명확히 루트 디렉토리 아래의 sessions 파일에 저장되지만,
쿠키는 따로 명확한 위치가 없다. (기본적으로 클라리언트의 cookie storage에 저장, UnityWebRequest의 경우 쿠키를 자동 저장하지 않기 때문에 직접 저장해야 한다)
로그인 후 확인해보자면,
저 밑에 Response에 set-cookie라는 이름을 갖는 쿠키 값이 있는 것을 확인할 수 있다.
var cookie = www.GetResponseHeader("set-cookie");
if (!string.IsNullOrEmpty(cookie))
{
int lastIndex = cookie.LastIndexOf(";");
string sid = cookie.Substring(0, lastIndex);
PlayerPrefs.SetString("sid", sid);
}
우리는 다음과 같은 코드로 signin을 할 때 쿠기 값을 가져와서 PlayerPrefs에 Sid라는 이름으로 저장할 것이다.
문제 : cookie의 값이 계속 Null이 나오는 문제
현재, cookie의 값에 아무것도 할당되지 않고 있다.
set-cookie라는 헤더가 전달되지 않고 있다는 뜻인데, 유니티에서는 자체적으로 쿠키를 저장하지 않는 것으로 알고 있기 때문에 한 번 이상 signin이라는 데이터를 전송해도 전송 시 Header에 cookie값이 포함되지 않기에 응답의 헤더에
set-cookie가 오는 것이 정상이고, 그렇게 된다면 cookie 값이 null이 나오면 안된다.
해결 : Session을 삭제하고 하면 새로 set-cookie를 보내면서 된다.
내일 확실하게 질문해봐야겠다.
결론 : 쿠키를 안쓰는게 좋다.
'개념공부' 카테고리의 다른 글
SocketIO 관련 정리 (0) | 2025.03.12 |
---|---|
JSON 기초 정리 (with Unity) (0) | 2025.03.11 |
UnityWebRequest (0) | 2025.03.05 |
Task, Async/Await (0) | 2025.02.22 |
생성자(Constructor) (0) | 2025.02.18 |