Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

김기웅 5주차 과제 제출 #4

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions kiwoong.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@

##사용자 관점에서의 로그인 과정 흐름

#사용자가 로그인 페이지에 접속하여 ID와 비밀번호를 입력하는 순간부터 로그인에 성공하고 실패하는 순간까지의 과정을 설명하세요. (2경우 전부)

사용자가 로그인 페이지에서 자신의 id와 비밀번호를 입력합니다.

[성공]DB에 저장되어있는 id와 비밀번호가 일치하면 로그인 성공입니다.

[실패]id 칸이 비어있다면 "로그인 ID가 필요합니다" 메세지가, DB에 저장되어있는 정보와 다르다면 "회원 정보를 찾을 수 없습니다."나 "비밀번호가 일치하지 않습니다."가 출력됩니다.

사용자 관점에서는 뒤에서 돌아가는 로직을 모르기 때문에 간단하게 필요한 부분만 보입니다.



#로그인 성공 후 사용자에게 제공되는 경험을 설명하고, 특히 '로그인 유지'가 어떻게 사용자 관점에서 나타나는지 서술하세요.

로그인에 성공했다면 새로고침 하거나 다른 페이지로 이동해도 로그아웃을 하기 전까지는 계속 로그인이 되어있고, 권한도 계속 부여받습니다.
이 또한 사용자 관점에서는 필요한 부분만 보입니다.


##서버가 로그인한 사용자를 인식하는 방식

#로그인한 사용자를 서버가 지속적으로 인식하기 위해 쿠키와 세션이 어떻게 사용되는지 설명하세요. (서버 딴에서 api 호출할 때마다 어떤 일이 일어나는지.)

서버가 지속적으로 사용자를 인식하기 위해 이 로그인 방법에서는 쿠키와 세션을 이용합니다.
우선 쿠키는 사용자에 저장되는 아주 작은 조각이고 JSESSOINID로 저장되는데, 이는 규칙이 없는 무작위 배열입니다.
api를 호풀하면 서버에서는 해당 세션을 조회하고, SecurityContext의 getAuthentication()으로 사용자 정보를 반환해줍니다.



#쿠키가 세션 기반 로그인에서 어떤 역할을 하는지 구체적으로 서술하고, 특히 세션 ID가 쿠키에 저장되어 클라이언트와 서버 간에 전달되는 과정에 대해 설명하세요.


쿠키의 역할은 세션을 식별할 수 있게 해주고, 상태를 유지하여 이후의 요청시 서버에 쿠키가 전달되어 편하게 활용할 수 있습니다.
또 한번 인증을 받으면 추가적으로 받지 않아도 다른 부분에 접근 할 수 있게 도와줍니다.
세션 ID는 사용자가 로그인 정보를 입력하고 요청을 보냈을때, 만약 입력값과 DB의 정보가 맞아 인증이 되면 새로운 세션을 생성하여 위에서 말한 JESSIONID를 생성합니다.
여기서 서버의 데이터베이스에 생성된 JSESSIONID가 저장되고, 클라이언트는 쿠키에 세션 ID가 저장되어 추가적으로 인증할때 사용되는 방식입니다.
로그아웃시에는 invalidateHttpSession(true)으로 세션을 무효화하고, deleteCookies("JSESSIONID"로 JSESSIONID 쿠키를 삭제하여 다시 인증할 수 없도록 합니다.



#세션을 구현할 때 보안적으로 고려해야할 부분이 뭐가 있을까요? (5주차 코드에는 생략되어 있음) 찾아보시기 바랍니다.


우선 가장 먼저 생각났던 것은 사용자에게 저장 된 쿠키를 누군가가 악의적으로 탈취하면 바로 사용할 수 있다는 점이 위험해보였습니다.

-해결방법-
공용네트워크에서 사용하지 않기.
일정 시간이 지나면 자동 로그아웃 되는 기능을 넣기.
로그아웃을 할시, 세션 정보를 완전히 삭제하기
이러한 기능들을 추가하여 해당 문제를 일정부분 해소할 수 있다고 생각하였습니다.

ID가 어느정도 예측이 가능하면 위험할 것 같다고 생각하였습니다.
특정 문자에 맞는 암호가 있다던가 하는 방식이라면 충분히 세션ID를 예측할 수 있을 것 같아 찾아보았습니다. 하지만 JSESSIONID는 전혀 규칙이 없는 무작위 배열이어서 안전해보였습니다.

또한 교차 사이트 요청 위조(Cross-Site Request Forgery) 공격을 방지하여야합니다.
이를 위해서는 위조 방지 토큰(요청 검증 토큰,Request Verification Tokens)을 사용해야합니다. 이 토큰으로 두 개의 다른 사이트에서 호스트되고 있는 문서들이 서로 상대방의 콘텐트에 접근하는 것을 막아. 요청을 보낼 수는 있지만 받을 수 는 없도록 만듭니다.