쿠키 : 정보가 적힌 텍스트
단점 : 비밀번호 같은거 적어두면 탈취되면 큰일남 (= 보안 낮음)
단점 : 쿠키를 받을 때마다 거기 적힌 세션 ID가 유효한 건지 서버에 있는 세션 저장소에서 매번 검색을 해야 하니까 서버에 부하가 많이 감
토큰 : a358adsfbjncjkb0a0... 이렇게 생긴 문자열
토큰은 헤더, 페이로드, 시그니처로 나뉨
헤더 : 종류(JWT는 JSON), 인코딩한 알고리즘
페이로드 : 사용자 정보들 (해독 가능하니 중요한 거 넣으면 안됨)
시그니처 : 알고리즘, 서버 비밀키로 암호화해서 만든 서명 (이것 때문에 위조 불가)
단점 : 해커한테 토큰 털려도 그것만 만료시키는거 불가능
access token : 만료 기간 짧은 사용자 인증용 토큰
refresh token : 만료 기간 긴 토큰 갱신용 토큰. 서버에 검증용 저장소가 있음.
평소엔 access token으로 인증하다가
토큰이 털리면 refresh token을 만료시키면 됨
단점 : 평소엔 access token으로만 인증하니까 서버 부하 덜 가지만 어쨌든 refresh token을 쓸 때는 서버에 부하가 가해짐.
내 브랜치에서
git pull --no-rebase origin <branch-name>
git merge --abort
<script type="text/javascript">
window.history.forward();
function noBack() { window.history.forward(); }
</script>
<body onload="noBack();" onpageshow="if(event.persisted) noBack();" onunload="">
이거 2개 추가했는데 뒤로가기 2번 누르면 결국 돌아가짐.
뒤로가기 막는 건 다른 구현 방식으로도 마찬가지인듯 함.
이벤트 리스너 달아서 토큰이나 세션 없는 사람 차별대우 하는 건 맞는데
아예 안 보여주는게 아니라 별도의 렌더링을 보여주는듯
<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">
3, 4는 캐시 건드릴만큼 민감한 페이지는 아니여서 적용 안 해봄.
진짜 중요 정보가 있는 페이지에는 이것도 적용시켜야할듯?
function checkToken() {
fetch('/check_token')
.then(response => response.json())
.then(data => {
if (!data.logged_in) {
alert('세션이 만료되었습니다. 로그인 페이지로 이동합니다.');
window.location.href = '/login';
}
});
}
setInterval(checkToken, 100);
뒤로가기 누르면 alert가 하나만 뜨는게 아니라 여러번 뜸.
잘 꺼지지도 않음. 유저 경험 불쾌.
서버에 요청 계속 들어옴. 터미널 꽉 차서 불편함.
브라우저 디버거 설정에서 JS 작동 끄면 되돌아가지긴 함. (의미 없는 점이긴 할듯)
window.addEventListener('pageshow', checkToken);
window.addEventListener('popstate', checkToken);
setInterval말고 이벤트 리스너 2가지에 등록했더니 여러 번 뜨지도 않고 서버에 요청도 안 보냄. 이걸로 해결.
function makeCard() {
// CSR로 카드 생성
let tempHtml = `<div class="card">
<button class="apply-button"">버튼</button>
</div>`;
let $card = $(tempHtml);
$("#cards-box").append($card);
// 카드 생성 후 버튼 비활성화 타이머 설정
endTime($card.find('.apply-button'), end);
}
let $card = $(tempHtml);를 사용하여 jQuery 객체로 변환한 $card는 해당 카드의 HTML 요소를 가리킴.
이 객체는 ("#cards-box").append(card);를 통해 DOM에 추가된 후에도 여전히 해당 요소를 참조함.
따라서, DOM에 추가된 후에도 $card를 통해 특정 카드를 조작할 수 있음.
ubuntu 24.04 LTS인데 gcc가 안 깔려있었음. gcc 깔았더니 해결됨.
If you arrive at this page, it's possibly because your going through the 'Introduction to Operating Systems' book and tried to copy the code from the intro chapter directly and compile. At least, that's why I ended up here. This won't work, and will throw the above error.
It's best to download the code directly from the source and compile what they give you. Enjoy!
c 파일 실행 전에 markfile이라는 걸로 컴파일을 해야 하는데 그거 명령어 및 로그.
terminal에서 c 파일이 있는 경로로 이동한 뒤
make 입력하면 markfile이 c 파일들을 컴파일 해준다.
터미널에 ./파일이름 "인자"
을 입력하면 컴파일된 파일들이 실행된다.
Ubuntu/Debian이면
sudo apt update
sudo apt install build-essential
이러면 markfile 설치됨
int argc랑 char *argv[]가 뭔지,
fprintf는 뭔지,
stderr는 뭔지,
exit(1); 는 뭐하는 함수인지,
malloc(sizeof(int)); 이건 또 뭔지,
assert(p != NULL); 이건 또 뭔지,
*p = atoi(argv[1]); 이건 또 뭔지, * 이건 왜 붙어있는건지,
그밖에 내가 알아야 되는거 있으면 또 알려줘
: 정수를 가리키는 포인터 p를 선언.
sizeof(int) 바이트 크기의 메모리를 동적으로 할당하고, 그 주소를 p에 저장.
assert는 조건이 참인지 검사하고, 거짓이면 프로그램을 종료하는 함수.
무한 루프
printf는 포맷팅된 문자열을 출력하는 함수입니다.
getpid()는 현재 프로세스의 ID를 반환합니다.
*p는 현재 p가 가리키는 메모리 위치의 값을 출력합니다.