In 1947, the movie's narrator, Stingo (Peter MacNicol), a young writer from the American South, travels to post-WW II Brooklyn. He is befriended by Sophie Zawistowski (Meryl Streep), a beautiful Polish immigrant, and her lover, Nathan Landau (Kevin Kline). It is clear to Stingo from the serial number tattooed into Sophie's forearm that she is no stranger to pain, as she is an Holocaust survivor.
One evening, Stingo talks with Sophie and learns some more about her past: that she was married but her husband and her father were killed in a German work camp. When Stingo notices scars on Sophie's wrists, Sophie explains that after being rescued from Auschwitz she was taken to a refugee camp in Sweden, but whilst there she went to a church, broke a glass, and cut her wrists. Sophie goes into another room where Nathan spends a lot of his time and finds another wine bottle. The walls are covered in images of the Holocaust, prompting Sophie to explain that it is Nathan's obsession.
Sophie and Nathan's relationship is endangered both by Sophie's ghosts and Nathan's obsession with the Holocaust, as well as his violent temper and increasingly apparent mental illness. When Stingo visits a man who knew Sophie's father, he discovers she's been lying to him. He learns that Sophie's father, a Polish college professor, hated Jews. Later, when Stingo talks to Sophie about this, she explains, with more about her past emerging through a series of harrowing flashbacks.
Something makes Sophie go to the Jewish ghetto, where she looks at all the people her father has condemned to die. She suddenly remembers that her father is waiting for his speech and hurries home to finish the typing. In her haste, Sophie makes a lot of mistakes and hurries to university. Her father (Ivica Pajer) reads the speech in front of a large crowd of people and becomes very angry.
Later, Sophie has a lover, Józef (Nedim Prohic), who lives with his half-sister, Wanda (Katharina Thalbach), a leader in the Resistance. Wanda tries to convince Sophie to translate some stolen Gestapo documents, but fearing she may endanger her children (Jennifer Lawn & Adrian Kalitka), she declines. Two weeks later, Józef is murdered by the Gestapo, and a short time later Sophie is arrested and sent to Auschwitz with her children. Upon arrival, the Germans decide who will live and who will die. Jan, Sophie's son, is sent to the children's camp, and her daughter, Eva, is sent to her death in Crematorium Two.
Sophie later learns of an epidemic in the children's camp, and becomes concerned for her son's well-being. She convinces the Commandant to let him into the Lebensborn programme. He relents and tells Sophie she will see him the next day. However, the Commandant breaks his promise about letting Sophie see her son. She never found out what happened to him.
Back in the present, Nathan asks Sophie to marry him and she accepts. Stingo feels betrayed, as he is falling in love with Sophie, but agrees to be Nathan's best man. When Nathan goes into another of his violent moods, Sophie runs to Stingo. At this point, Nathan makes a threatening phone-call which ends with the sound of a gun firing, and Nathan making more threats.
Stingo and Sophie flee and check into a hotel. Stingo insists that they start a family, but Sophie has yet to tell him her final secret - her choice. She recounts the night she arrived at Auschwitz with her children, and of how a Nazi officer forced her to choose life for one child, and death for the other.
Despite her plea of "Don't make me choose. I can't choose", Sophie's words fall on deaf ears. When a young Nazi is told to take both children away, she releases her daughter, shouting "Take my little girl!". Sophie can only watch as the screaming little girl is carried away to die, her guilt and despair all too clear. Once she has told him, Sophie asks Stingo not to talk about marriage and children.
They sleep together that night, but Stingo wakes up alone. Sophie has left him a note, saying she has gone back to Nathan, but that he is a great lover. Stingo later goes back to the building where he met Sophie and Nathan, only to find everybody in a state of shock. Stingo is led up to Sophie and Nathan's room where he finds they have committed suicide. Picking up Nathan's book of Emily Dickinson poems, Stingo recites "Ample Make This Bed", as if he were delivering a eulogy at a funeral.
The film ends with Stingo leaving Brooklyn, the screen going misty, and an image of Sophie's face fading into view.