[architecture] 로그 아웃 : GET 또는 POST?

이 질문은 일반적으로 GET 또는 POST를 언제 사용해야하는지에 관한 것이 아닙니다. 웹 응용 프로그램에서 로그 아웃을 처리하는 데 권장되는 정보입니다. 일반적인 의미에서 GET과 POST의 차이점에 대한 많은 정보를 찾았지만이 특정 시나리오에 대한 명확한 대답을 찾지 못했습니다.

실용 주의자로서 GET을 사용하는 경향이 있습니다. POST를 구현하는 것이 훨씬 간단하기 때문입니다. 간단한 링크를 삭제하면됩니다. 이것은 적어도 내 머리 꼭대기에서 생각할 수있는 대다수의 웹 사이트의 경우처럼 보입니다. 스택 오버 플로우조차도 GET으로 로그 아웃을 처리합니다.

나를 주저하게 만드는 것은 일부 웹 액셀러레이터 / 프록시가 페이지에서 찾은 모든 링크를 찾아서 검색하여 페이지를 미리 캐시한다는 (오래된) 주장입니다. 따라서 사용자는 클릭 할 때 더 빠른 응답을 얻습니다. 이것이 여전히 적용되는지 확실하지 않지만, 이것이 사실이라면 이론적으로 이러한 액셀러레이터 중 하나를 가진 사용자는 로그인하자마자 응용 프로그램에서 쫓겨날 것입니다. 클릭하지 않아도 링크가 표시됩니다.

지금까지 읽은 모든 내용은 POST가 “파괴적 조치”에 사용되어야하지만 애플리케이션과 같은 쿼리의 내부 상태를 변경하지 않는 조치는 GET으로 처리되어야한다고 제안합니다 . 이를 바탕으로 실제 질문은 다음과 같습니다.

응용 프로그램에서 로그 아웃하면 파괴적인 행동으로 간주됩니까 / 응용 프로그램의 내부 상태를 변경합니까?



답변

사용하십시오 POST.

2010 년에는 GET아마도 사용 이 용인되었을 것입니다. 그러나 오늘날 (2013 년) 브라우저는 다음에 방문 할 “생각하는”페이지를 미리 가져옵니다.

다음은 Twitter 에서이 문제에 대해 이야기하는 StackOverflow 개발자 중 하나입니다.

편리한 URL 프리 페칭을 위해 GET 요청을 로그 오프 한 Chrome 팀과 Chrome 팀에 감사의 말씀을 전합니다.-Nick Craver ( @Nick_Craver ) 2013 년 1 월 29 일

재미있는 사실 : StackOverflow는 GET을 통한 로그 아웃을 처리하는 데 사용되었지만 더 이상은 아닙니다.


답변

REST에는 세션이 없어야하므로 삭제할 것이 없습니다. REST 클라이언트는 모든 요청에 ​​대해 인증합니다. 로그인 또는 로그 아웃은 환상 일뿐입니다.

당신이 정말로 요구하는 것은 브라우저가 모든 요청에 ​​대해 인증 정보를 계속 전송해야한다는 것입니다.

아마도 응용 프로그램이 로그인 한 것처럼 보이는 착각을 초래한다면 자바 스크립트를 사용하여 “로그 아웃”할 수 있어야합니다. 왕복 여행이 필요하지 않습니다.


수비 논문- 섹션 5.1.3

클라이언트에서 서버로의 각 요청에는 요청을 이해하는 데 필요한 모든 정보가 포함되어야하며 서버에 저장된 컨텍스트를 활용할 수 없습니다. 따라서 세션 상태는 전적으로 클라이언트에서 유지됩니다


답변

GET여기서 남용 될 수있는 한 가지 방법 은 인터넷을 통해 사람 (경쟁자 :)이 src="<your logout link>"ANYWHERE 와 함께 이미지 태그를 배치하고 사이트 사용자가 해당 페이지를 우연히 발견 한 경우 무의식적으로 로그 아웃하는 것입니다.


답변

정확히 말하면, GET / POST (또는 다른 동사)는 일부 리소스 (URL로 주소 지정)에 대한 작업이므로 일반적으로 응용 프로그램 상태가 아니라 리소스 상태에 대한 것입니다. 따라서 진정한 의미에서,와 같은 URL이 있어야하며 [host name]\[user name]\session‘DELETE’는 로그 아웃 작업에 올바른 동사가됩니다.

[host name]\bla bla\logout실제로 REST 풀 웨이 (IMO)가 아닌 URL로 사용 하는 이유는 무엇입니까? GET / POST의 올바른 사용법에 대해 토론 해야하는 이유는 무엇입니까?

물론, 나는 또한 내 응용 프로그램에서 로그 아웃 URL에 GET을 사용합니다 🙂


답변

로그 아웃하면 응용 프로그램 자체에는 아무런 영향이 없습니다. 응용 프로그램과 관련하여 사용자의 상태를 변경합니다. 이 경우 질문은 사용자로부터 명령을 시작하여이 작업을 시작하는 방법에 따라 결정됩니다. 이는 “파괴적인 조치”가 아니므로 세션이 중단되거나 삭제되었지만 응용 프로그램이나 데이터가 변경되지 않았으므로 두 방법으로 로그 아웃 절차를 시작할 수 없습니다. 이 게시물은 사용자가 시작한 모든 작업 (예 : 사용자가 “로그 아웃”을 클릭 함)에 의해 사용되어야하지만 응용 프로그램이 시작한 로그 아웃을 위해 예약 될 수 있습니다 (예 : 잠재적 인 사용자 침입을 감지 한 예외는 로그 아웃 GET을 사용하여 로그인 페이지로 강제로 리디렉션 됨) ).


답변

내 관점에서 안녕하세요, 로그인 할 때 사용자 이름 / 비밀번호를 확인하고 일치하는 경우 로그인 토큰을 만듭니다.

CREAT 토큰 => 메소드 POST

로그 아웃 할 때 가장 논리적 인 방법은 DELETE 여야합니다.

DELETE 토큰 => 메소드 DELETE


답변

사전 캐싱 시나리오는 흥미로운 시나리오입니다. 그러나 나는 많은 사이트가 너무 걱정하지 않는다면 아마 당신도 그렇게해서는 안된다고 생각합니다.

아니면 링크가 자바 스크립트로 구현 될 수 있습니까?

편집 : 내가 이해하는 것처럼 기술적으로 GET은 응용 프로그램 상태를 변경하지 않는 읽기 전용 요청이어야합니다. POST는 상태를 변경하는 쓰기 / 편집 요청을위한 것이어야합니다. 그러나 다른 응용 프로그램 문제는 일부 상태 변경 요청에 대해 POST보다 GET을 선호 할 수 있으며 이것에 아무런 문제가 없다고 생각합니다.