크래프톤 정글 TIL : 0703

lazyArtisan·2024년 7월 3일
0

정글 TIL

목록 보기
3/147

쿠키

쿠키 : 정보가 적힌 텍스트

  1. 김씨가 '빨간색'을 좋아한다고 서버에 말함
  2. '빨간색을 좋아한다'는 정보를 담은 쿠키를 서버에서 보내면 김씨 클라이언트에 저장됨
  3. 다음부터 김씨는 서버에 쿠키만 보냄
  4. 다음부터 김씨는 빨간색을 좋아한다고 또 알릴 필요 없이 빨간색 웹사이트 볼 수 있음

단점 : 비밀번호 같은거 적어두면 탈취되면 큰일남 (= 보안 낮음)

세션

  1. 김씨가 서버에 들어오면 서버가 김씨만을 위한 세션 ID(=daf2jkcg)가 적힌 쿠키를 보내줌
  2. 다음부터 김씨는 서버에 쿠키만 보냄
  3. 서버는 쿠키를 받아서 그 안에 있는 세션 ID가 세션 저장소에 있는지 확인
  4. 김씨는 이제 비밀번호, 카드번호같은 거 또 입력할 필요 없이 서버에 저장된 정보 쓰면 됨
  1. 다른 사람이 김씨라고 위장하고 서버에 들어왔음
  2. 김씨는 그것을 알아차림
  3. 서버에 요청해서 '김씨2'라는 세션 ID가 들어있는 쿠키는 못 들어가게 할 수 있음

단점 : 쿠키를 받을 때마다 거기 적힌 세션 ID가 유효한 건지 서버에 있는 세션 저장소에서 매번 검색을 해야 하니까 서버에 부하가 많이 감

JWT

토큰 : a358adsfbjncjkb0a0... 이렇게 생긴 문자열

토큰은 헤더, 페이로드, 시그니처로 나뉨

헤더 : 종류(JWT는 JSON), 인코딩한 알고리즘
페이로드 : 사용자 정보들 (해독 가능하니 중요한 거 넣으면 안됨)
시그니처 : 알고리즘, 서버 비밀키로 암호화해서 만든 서명 (이것 때문에 위조 불가)

  1. 김씨가 서버에 들어오면 '김씨'라는 정보를 담은 토큰을 보내줌
  2. 다음부터 김씨는 서버에 토큰만 보냄
  3. 서버는 토큰을 분해해보고 유효한 토큰인지 아닌지만 확인함
  4. 유효하면 김씨를 들여보내줌

단점 : 해커한테 토큰 털려도 그것만 만료시키는거 불가능

Access Token, Refresh Token

access token : 만료 기간 짧은 사용자 인증용 토큰
refresh token : 만료 기간 긴 토큰 갱신용 토큰. 서버에 검증용 저장소가 있음.

평소엔 access token으로 인증하다가
토큰이 털리면 refresh token을 만료시키면 됨

단점 : 평소엔 access token으로만 인증하니까 서버 부하 덜 가지만 어쨌든 refresh token을 쓸 때는 서버에 부하가 가해짐.

다른 branch와 병합한 방법

내 브랜치에서

git pull --no-rebase origin <branch-name>

병합하다가 취소하기

git merge --abort

로그아웃 후 뒤로가기 하면 페이지 보임

1. 뒤로가기를 막는다?

<script type="text/javascript">
  window.history.forward();
  function noBack() { window.history.forward(); }
</script>
<body onload="noBack();" onpageshow="if(event.persisted) noBack();" onunload="">

이거 2개 추가했는데 뒤로가기 2번 누르면 결국 돌아가짐.
뒤로가기 막는 건 다른 구현 방식으로도 마찬가지인듯 함.

2. velog처럼 로그인하라고 별도로 렌더링?

이벤트 리스너 달아서 토큰이나 세션 없는 사람 차별대우 하는 건 맞는데
아예 안 보여주는게 아니라 별도의 렌더링을 보여주는듯

3. HTTP 응답 헤더에 Cache-Control 필드 설정?

4. HTML Meta 태그를 사용하여 캐시 비활성화

<meta http-equiv="Cache-Control" content="no-store, no-cache, must-revalidate, max-age=0">

3, 4는 캐시 건드릴만큼 민감한 페이지는 아니여서 적용 안 해봄.
진짜 중요 정보가 있는 페이지에는 이것도 적용시켜야할듯?

5. JavaScript를 사용하여 페이지가 로드될 때마다 토큰을 검증하여 사용자가 권한이 없으면 리다이렉트 (채택)

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가지에 등록했더니 여러 번 뜨지도 않고 서버에 요청도 안 보냄. 이걸로 해결.

jquery 객체 선택

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를 통해 특정 카드를 조작할 수 있음.

운영체제 예습

가상화가 뭐임

블로그 1
블로그 2

리눅스 쓰는데 #include <stdio.h>도 오류 뜸

ubuntu 24.04 LTS인데 gcc가 안 깔려있었음. gcc 깔았더니 해결됨.

#include "common.h"도 오류 뜸

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!

스택오버플로우에 답변 달려 있었음

<그림 2.1> 아래에 있는 코드들은 뭐임?

c 파일 실행 전에 markfile이라는 걸로 컴파일을 해야 하는데 그거 명령어 및 로그.
terminal에서 c 파일이 있는 경로로 이동한 뒤
make 입력하면 markfile이 c 파일들을 컴파일 해준다.
터미널에 ./파일이름 "인자"을 입력하면 컴파일된 파일들이 실행된다.

make 명령어가 안됨

Ubuntu/Debian이면

sudo apt update
sudo apt install build-essential

이러면 markfile 설치됨

<그림 2.3>

gpt 질문 내용

int argc랑 char *argv[]가 뭔지,
fprintf는 뭔지,
stderr는 뭔지,
exit(1); 는 뭐하는 함수인지,
malloc(sizeof(int)); 이건 또 뭔지,
 assert(p != NULL); 이건 또 뭔지,
*p = atoi(argv[1]); 이건 또 뭔지, * 이건 왜 붙어있는건지,
그밖에 내가 알아야 되는거 있으면 또 알려줘

int main(int argc, char *argv[])

  • argc (argument count): 명령줄 인자의 개수. 프로그램 이름도 포함되므로 인자가 없을 때도 argc는 1.
  • argv (argument vector): 명령줄 인자 문자열의 배열. argv[0]은 프로그램 이름이고, 그 이후로는 인자로 전달된 값들이 저장됨.

fprintf(stderr, "usage: mem \n");:

  • fprintf는 포맷팅된 문자열을 출력하는 함수.
  • stderr는 표준 오류 출력 스트림. 일반적으로 오류 메시지를 출력할 때 사용.

int *p;

: 정수를 가리키는 포인터 p를 선언.

p = malloc(sizeof(int));

sizeof(int) 바이트 크기의 메모리를 동적으로 할당하고, 그 주소를 p에 저장.

  • malloc : 메모리를 동적으로 할당하는 함수.
  • sizeof(int) : 정수형 데이터의 크기를 반환.

assert(p != NULL);

assert는 조건이 참인지 검사하고, 거짓이면 프로그램을 종료하는 함수.

*p = atoi(argv[1]);

  • atoi : 문자열을 정수로 변환하는 함수.
  • argv[1]은 첫 번째 명령줄 인자.
  • *p = atoi(argv[1]);: 변환된 정수 값을 p가 가리키는 메모리 주소에 저장합니다.

while (1) { ... }

무한 루프

printf("(%d) value of p: %d\n", getpid(), *p);:

printf는 포맷팅된 문자열을 출력하는 함수입니다.
getpid()는 현재 프로세스의 ID를 반환합니다.
*p는 현재 p가 가리키는 메모리 위치의 값을 출력합니다.

exit 함수의 인자

  • 정상 종료: exit(0)
    0은 정상 종료를 나타냅니다.
    프로그램이 성공적으로 종료되었음을 의미.
  • 비정상 종료: exit(1) 또는 exit에 0이 아닌 다른 값을 인자로 전달
    1 또는 다른 값은 비정상 종료를 의미.
    프로그램이 예상치 못한 문제로 인해 종료되었음을 의미.

0개의 댓글